triflux 10.3.4 → 10.7.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/LICENSE +21 -21
- package/bin/tfx-doctor-tui.mjs +1 -1
- package/bin/tfx-doctor.mjs +6 -1
- package/bin/tfx-profile.mjs +1 -1
- package/bin/tfx-setup-tui.mjs +1 -1
- package/bin/tfx-setup.mjs +6 -1
- package/bin/triflux.mjs +2396 -1140
- package/hooks/agent-route-guard.mjs +12 -8
- package/hooks/cross-review-tracker.mjs +21 -8
- package/hooks/error-context.mjs +19 -7
- package/hooks/hook-adaptive-collector.mjs +18 -16
- package/hooks/hook-manager.mjs +93 -32
- package/hooks/hook-orchestrator.mjs +108 -24
- package/hooks/hook-registry.json +11 -0
- package/hooks/keyword-rules.json +6 -10
- package/hooks/lib/resolve-root.mjs +1 -1
- package/hooks/mcp-config-watcher.mjs +6 -2
- package/hooks/pipeline-stop.mjs +3 -6
- package/hooks/safety-guard.mjs +99 -28
- package/hooks/session-start-fast.mjs +143 -0
- package/hooks/subagent-verifier.mjs +5 -4
- package/hub/account-broker.mjs +256 -60
- package/hub/adaptive-diagnostic.mjs +75 -48
- package/hub/adaptive-inject.mjs +95 -57
- package/hub/adaptive-memory.mjs +156 -42
- package/hub/adaptive.mjs +60 -31
- package/hub/assign-callbacks.mjs +67 -30
- package/hub/bridge.mjs +0 -1
- package/hub/cli-adapter-base.mjs +200 -48
- package/hub/codex-adapter.mjs +76 -96
- package/hub/codex-compat.mjs +3 -3
- package/hub/codex-preflight.mjs +63 -37
- package/hub/delegator/contracts.mjs +19 -23
- package/hub/delegator/index.mjs +3 -3
- package/hub/delegator/service.mjs +88 -64
- package/hub/delegator/tool-definitions.mjs +5 -5
- package/hub/fullcycle.mjs +33 -17
- package/hub/gemini-adapter.mjs +69 -94
- package/hub/hitl.mjs +89 -30
- package/hub/intent.mjs +161 -38
- package/hub/lib/cache-guard.mjs +43 -17
- package/hub/lib/mcp-response-cache.mjs +66 -32
- package/hub/lib/memory-store.mjs +285 -111
- package/hub/lib/path-utils.mjs +35 -37
- package/hub/lib/process-utils.mjs +106 -37
- package/hub/lib/spawn-trace.mjs +527 -0
- package/hub/lib/ssh-command.mjs +34 -4
- package/hub/lib/ssh-retry.mjs +5 -1
- package/hub/lib/uuidv7.mjs +4 -3
- package/hub/memory-doctor.mjs +266 -106
- package/hub/middleware/request-logger.mjs +61 -34
- package/hub/paths.mjs +9 -9
- package/hub/pipeline/gates/confidence.mjs +34 -15
- package/hub/pipeline/gates/consensus.mjs +27 -15
- package/hub/pipeline/gates/index.mjs +7 -3
- package/hub/pipeline/gates/selfcheck.mjs +57 -19
- package/hub/pipeline/index.mjs +77 -42
- package/hub/pipeline/state.mjs +10 -10
- package/hub/pipeline/transitions.mjs +40 -23
- package/hub/platform.mjs +57 -48
- package/hub/promote-penalties.mjs +25 -7
- package/hub/quality/deslop.mjs +70 -49
- package/hub/research.mjs +32 -25
- package/hub/router.mjs +240 -107
- package/hub/routing/complexity.mjs +132 -29
- package/hub/routing/index.mjs +17 -12
- package/hub/routing/q-learning.mjs +76 -28
- package/hub/server.mjs +4 -4
- package/hub/session-fingerprint.mjs +126 -60
- package/hub/state.mjs +84 -43
- package/hub/store-adapter.mjs +59 -26
- package/hub/store.mjs +356 -153
- package/hub/team/agent-map.json +22 -7
- package/hub/team/ansi.mjs +186 -122
- package/hub/team/backend.mjs +28 -10
- package/hub/team/cli/commands/attach.mjs +29 -9
- package/hub/team/cli/commands/control.mjs +29 -8
- package/hub/team/cli/commands/debug.mjs +32 -11
- package/hub/team/cli/commands/focus.mjs +38 -11
- package/hub/team/cli/commands/interrupt.mjs +18 -6
- package/hub/team/cli/commands/kill.mjs +16 -5
- package/hub/team/cli/commands/list.mjs +11 -4
- package/hub/team/cli/commands/send.mjs +19 -6
- package/hub/team/cli/commands/start/index.mjs +154 -31
- package/hub/team/cli/commands/start/parse-args.mjs +38 -11
- package/hub/team/cli/commands/start/start-headless.mjs +112 -36
- package/hub/team/cli/commands/start/start-in-process.mjs +12 -2
- package/hub/team/cli/commands/start/start-mux.mjs +70 -21
- package/hub/team/cli/commands/start/start-wt.mjs +29 -12
- package/hub/team/cli/commands/status.mjs +43 -14
- package/hub/team/cli/commands/stop.mjs +11 -4
- package/hub/team/cli/commands/task.mjs +8 -3
- package/hub/team/cli/commands/tasks.mjs +1 -1
- package/hub/team/cli/index.mjs +2 -2
- package/hub/team/cli/manifest.mjs +38 -8
- package/hub/team/cli/render.mjs +30 -8
- package/hub/team/cli/services/attach-fallback.mjs +31 -11
- package/hub/team/cli/services/hub-client.mjs +42 -14
- package/hub/team/cli/services/member-selector.mjs +11 -4
- package/hub/team/cli/services/native-control.mjs +48 -21
- package/hub/team/cli/services/runtime-mode.mjs +2 -1
- package/hub/team/cli/services/state-store.mjs +25 -8
- package/hub/team/cli/services/task-model.mjs +16 -6
- package/hub/team/conductor-mesh-bridge.mjs +24 -23
- package/hub/team/conductor.mjs +8 -4
- package/hub/team/dashboard-anchor.mjs +4 -5
- package/hub/team/dashboard-layout.mjs +3 -1
- package/hub/team/dashboard-open.mjs +41 -21
- package/hub/team/dashboard.mjs +76 -28
- package/hub/team/event-log.mjs +18 -10
- package/hub/team/handoff.mjs +31 -15
- package/hub/team/headless.mjs +2 -1
- package/hub/team/health-probe.mjs +69 -54
- package/hub/team/launcher-template.mjs +16 -13
- package/hub/team/native-supervisor.mjs +65 -21
- package/hub/team/native.mjs +74 -35
- package/hub/team/nativeProxy.mjs +184 -113
- package/hub/team/notify.mjs +119 -76
- package/hub/team/orchestrator.mjs +9 -4
- package/hub/team/pane.mjs +12 -7
- package/hub/team/process-cleanup.mjs +25 -16
- package/hub/team/psmux.mjs +491 -201
- package/hub/team/remote-probe.mjs +68 -52
- package/hub/team/remote-session.mjs +117 -59
- package/hub/team/remote-watcher.mjs +61 -33
- package/hub/team/routing.mjs +51 -25
- package/hub/team/runtime-strategy.mjs +3 -1
- package/hub/team/session.mjs +98 -34
- package/hub/team/staleState.mjs +72 -30
- package/hub/team/swarm-locks.mjs +15 -13
- package/hub/team/swarm-planner.mjs +32 -21
- package/hub/team/swarm-reconciler.mjs +48 -23
- package/hub/team/tui-lite.mjs +266 -68
- package/hub/team/tui-remote-adapter.mjs +14 -10
- package/hub/team/tui-viewer.mjs +99 -43
- package/hub/team/tui.mjs +708 -271
- package/hub/team/worktree-lifecycle.mjs +152 -58
- package/hub/team/wt-manager.mjs +24 -14
- package/hub/token-mode.mjs +71 -71
- package/hub/tray.mjs +66 -23
- package/hub/workers/claude-worker.mjs +162 -118
- package/hub/workers/codex-mcp.mjs +192 -141
- package/hub/workers/delegator-mcp.mjs +507 -333
- package/hub/workers/factory.mjs +8 -8
- package/hub/workers/gemini-worker.mjs +115 -84
- package/hub/workers/interface.mjs +6 -1
- package/hub/workers/worker-utils.mjs +21 -14
- package/hud/colors.mjs +27 -9
- package/hud/constants.mjs +162 -26
- package/hud/context-monitor.mjs +82 -41
- package/hud/hud-qos-status.mjs +129 -49
- package/hud/mission-board.mjs +6 -3
- package/hud/providers/claude.mjs +226 -115
- package/hud/providers/codex.mjs +62 -22
- package/hud/providers/gemini.mjs +168 -56
- package/hud/renderers.mjs +384 -119
- package/hud/terminal.mjs +101 -31
- package/hud/utils.mjs +78 -38
- package/mesh/index.mjs +11 -5
- package/mesh/mesh-budget.mjs +18 -9
- package/mesh/mesh-heartbeat.mjs +1 -1
- package/mesh/mesh-queue.mjs +3 -5
- package/mesh/mesh-router.mjs +5 -4
- package/package.json +2 -1
- package/scripts/__tests__/gen-skill-docs.test.mjs +36 -7
- package/scripts/__tests__/keyword-detector.test.mjs +77 -28
- package/scripts/__tests__/mcp-guard-engine.test.mjs +58 -20
- package/scripts/__tests__/remote-spawn-transfer.test.mjs +30 -19
- package/scripts/__tests__/remote-spawn.test.mjs +10 -4
- package/scripts/__tests__/session-start-fast.test.mjs +36 -0
- package/scripts/__tests__/skill-template.test.mjs +98 -50
- package/scripts/__tests__/smoke.test.mjs +1 -1
- package/scripts/__tests__/spawn-trace.test.mjs +102 -0
- package/scripts/__tests__/tfx-doctor-diagnose.test.mjs +48 -0
- package/scripts/cache-doctor.mjs +11 -4
- package/scripts/cache-warmup.mjs +96 -37
- package/scripts/claudemd-sync.mjs +27 -17
- package/scripts/codex-gateway-preflight.mjs +52 -37
- package/scripts/codex-mcp-gateway-sync.mjs +59 -39
- package/scripts/completions/tfx.bash +47 -47
- package/scripts/completions/tfx.fish +44 -44
- package/scripts/completions/tfx.zsh +83 -83
- package/scripts/config-audit.mjs +232 -0
- package/scripts/convert-to-tmpl.mjs +54 -0
- package/scripts/cross-review-gate.mjs +35 -12
- package/scripts/cross-review-tracker.mjs +21 -8
- package/scripts/demo.mjs +35 -17
- package/scripts/doctor-diagnose.mjs +284 -0
- package/scripts/gen-skill-docs.mjs +7 -2
- package/scripts/gen-skill-manifest.mjs +2 -1
- package/scripts/headless-guard.mjs +86 -48
- package/scripts/hub-ensure.mjs +45 -26
- package/scripts/keyword-detector.mjs +41 -20
- package/scripts/keyword-rules-expander.mjs +47 -30
- package/scripts/lib/claudemd-scanner.mjs +6 -1
- package/scripts/lib/context.mjs +3 -3
- package/scripts/lib/cross-review-utils.mjs +6 -3
- package/scripts/lib/env-probe.mjs +47 -28
- package/scripts/lib/gemini-profiles.mjs +44 -10
- package/scripts/lib/handoff.mjs +33 -17
- package/scripts/lib/hook-utils.mjs +8 -6
- package/scripts/lib/keyword-rules.mjs +43 -19
- package/scripts/lib/logger.mjs +24 -24
- package/scripts/lib/mcp-filter.mjs +377 -239
- package/scripts/lib/mcp-guard-engine.mjs +194 -79
- package/scripts/lib/mcp-manifest.mjs +23 -13
- package/scripts/lib/mcp-server-catalog.mjs +300 -63
- package/scripts/lib/psmux-info.mjs +11 -6
- package/scripts/lib/remote-spawn-transfer.mjs +44 -14
- package/scripts/lib/skill-template.mjs +30 -7
- package/scripts/mcp-check.mjs +58 -39
- package/scripts/mcp-gateway-config.mjs +83 -39
- package/scripts/mcp-gateway-ensure.mjs +43 -35
- package/scripts/mcp-gateway-integration-test.mjs +70 -58
- package/scripts/mcp-gateway-start.mjs +126 -60
- package/scripts/mcp-gateway-verify.mjs +24 -22
- package/scripts/mcp-safety-guard.mjs +44 -11
- package/scripts/notion-read.mjs +199 -84
- package/scripts/pack.mjs +94 -89
- package/scripts/preflight-cache.mjs +27 -10
- package/scripts/preinstall.mjs +42 -13
- package/scripts/remote-spawn.mjs +309 -94
- package/scripts/run.cjs +8 -5
- package/scripts/session-spawn-helper.mjs +130 -39
- package/scripts/session-stale-cleanup.mjs +123 -0
- package/scripts/setup.mjs +941 -492
- package/scripts/test-lock.mjs +20 -7
- package/scripts/test-tfx-route-no-claude-native.mjs +16 -12
- package/scripts/tfx-batch-stats.mjs +32 -11
- package/scripts/tfx-gate-activate.mjs +11 -4
- package/scripts/tfx-route-post.mjs +87 -20
- package/scripts/tfx-route-worker.mjs +57 -51
- package/scripts/tfx-route.sh +41 -124
- package/scripts/tmp-cleanup.mjs +21 -7
- package/scripts/token-snapshot.mjs +204 -85
- package/skills/.omc/state/agent-replay-8f0e10a9-9693-4410-96f5-a6b07e8ed995.jsonl +1 -0
- package/skills/.omc/state/idle-notif-cooldown.json +3 -0
- package/skills/.omc/state/last-tool-error.json +7 -0
- package/skills/.omc/state/subagent-tracking.json +7 -0
- package/skills/_templates/base.md +1 -6
- package/skills/merge-worktree/SKILL.md.tmpl +144 -0
- package/skills/shared/telemetry-segment.md +6 -0
- package/skills/star-prompt/SKILL.md.tmpl +222 -0
- package/skills/tfx-analysis/SKILL.md.tmpl +107 -0
- package/skills/tfx-analysis/skill.json +1 -6
- package/skills/tfx-auto/SKILL.md +1 -0
- package/skills/tfx-auto-codex/SKILL.md.tmpl +106 -0
- package/skills/tfx-auto-codex/skill.json +1 -3
- package/skills/tfx-autopilot/SKILL.md.tmpl +116 -0
- package/skills/tfx-autopilot/skill.json +1 -5
- package/skills/tfx-autoresearch/SKILL.md.tmpl +136 -0
- package/skills/tfx-autoroute/SKILL.md.tmpl +189 -0
- package/skills/tfx-autoroute/skill.json +1 -7
- package/skills/tfx-codex/SKILL.md +1 -0
- package/skills/tfx-codex/skill.json +1 -3
- package/skills/tfx-codex-swarm/SKILL.md.tmpl +16 -0
- package/skills/tfx-codex-swarm/evals/evals.json +1 -1
- package/skills/tfx-codex-swarm/skill.json +1 -4
- package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +54 -12
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +35 -7
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +35 -7
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +25 -5
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +25 -5
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +20 -4
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +16 -4
- package/skills/tfx-consensus/SKILL.md.tmpl +146 -0
- package/skills/tfx-debate/SKILL.md.tmpl +192 -0
- package/skills/tfx-debate/skill.json +1 -7
- package/skills/tfx-deep-analysis/SKILL.md.tmpl +228 -0
- package/skills/tfx-deep-analysis/skill.json +1 -5
- package/skills/tfx-deep-interview/SKILL.md.tmpl +203 -0
- package/skills/tfx-deep-plan/SKILL.md.tmpl +282 -0
- package/skills/tfx-deep-qa/SKILL.md.tmpl +165 -0
- package/skills/tfx-deep-qa/skill.json +1 -6
- package/skills/tfx-deep-research/SKILL.md.tmpl +217 -0
- package/skills/tfx-deep-review/SKILL.md.tmpl +179 -0
- package/skills/tfx-doctor/SKILL.md +21 -0
- package/skills/tfx-doctor/SKILL.md.tmpl +172 -0
- package/skills/tfx-doctor/skill.json +1 -3
- package/skills/tfx-find/SKILL.md +1 -0
- package/skills/tfx-forge/SKILL.md.tmpl +187 -0
- package/skills/tfx-fullcycle/SKILL.md.tmpl +286 -0
- package/skills/tfx-fullcycle/skill.json +1 -6
- package/skills/tfx-gemini/SKILL.md.tmpl +91 -0
- package/skills/tfx-gemini/skill.json +1 -3
- package/skills/tfx-hooks/SKILL.md.tmpl +216 -0
- package/skills/tfx-hooks/skill.json +1 -3
- package/skills/tfx-hub/SKILL.md.tmpl +212 -0
- package/skills/tfx-hub/skill.json +1 -3
- package/skills/tfx-index/SKILL.md +1 -0
- package/skills/tfx-index/skill.json +1 -6
- package/skills/tfx-interview/SKILL.md.tmpl +285 -0
- package/skills/tfx-multi/SKILL.md.tmpl +183 -0
- package/skills/tfx-multi/skill.json +1 -3
- package/skills/tfx-panel/SKILL.md.tmpl +189 -0
- package/skills/tfx-panel/skill.json +1 -7
- package/skills/tfx-persist/SKILL.md.tmpl +270 -0
- package/skills/tfx-persist/skill.json +1 -7
- package/skills/tfx-plan/SKILL.md +1 -0
- package/skills/tfx-plan/skill.json +1 -6
- package/skills/tfx-profile/SKILL.md.tmpl +239 -0
- package/skills/tfx-profile/skill.json +1 -3
- package/skills/tfx-prune/SKILL.md.tmpl +200 -0
- package/skills/tfx-prune/skill.json +1 -7
- package/skills/tfx-psmux-rules/SKILL.md.tmpl +326 -0
- package/skills/tfx-psmux-rules/skill.json +1 -4
- package/skills/tfx-qa/SKILL.md +1 -0
- package/skills/tfx-qa/skill.json +1 -6
- package/skills/tfx-ralph/SKILL.md.tmpl +28 -0
- package/skills/tfx-ralph/skill.json +1 -4
- package/skills/tfx-remote-setup/SKILL.md.tmpl +576 -0
- package/skills/tfx-remote-setup/skill.json +1 -3
- package/skills/tfx-remote-spawn/SKILL.md.tmpl +263 -0
- package/skills/tfx-remote-spawn/references/hosts.json +16 -0
- package/skills/tfx-remote-spawn/skill.json +1 -4
- package/skills/tfx-research/SKILL.md +1 -0
- package/skills/tfx-review/SKILL.md +1 -0
- package/skills/tfx-review/skill.json +1 -6
- package/skills/tfx-setup/SKILL.md.tmpl +504 -0
- package/skills/tfx-setup/skill.json +1 -3
- package/skills/tfx-swarm/SKILL.md +22 -0
- package/skills/tfx-swarm/SKILL.md.tmpl +218 -0
- package/tui/codex-profile.mjs +88 -33
- package/tui/core.mjs +45 -15
- package/tui/doctor.mjs +75 -28
- package/tui/gemini-profile.mjs +74 -29
- package/tui/monitor-data.mjs +8 -4
- package/tui/monitor.mjs +71 -27
- package/tui/setup.mjs +133 -42
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
---
|
|
2
|
+
internal: true
|
|
3
|
+
name: tfx-interview
|
|
4
|
+
description: "요구사항이 모호하거나 구현 전 명확화가 필요할 때 사용한다. 'interview', '인터뷰', '요구사항 정리', '뭘 만들어야 하는지 모르겠어', '명확하게 해줘' 같은 요청에 반드시 사용. 구현 시작 전 스펙을 확정하고 싶을 때 적극 활용."
|
|
5
|
+
triggers:
|
|
6
|
+
- interview
|
|
7
|
+
- 인터뷰
|
|
8
|
+
- 요구사항 탐색
|
|
9
|
+
- tfx-interview
|
|
10
|
+
- 모호성 분석
|
|
11
|
+
argument-hint: "<구현할 주제 또는 요구사항>"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# {{SKILL_NAME}} — Quantified Socratic Requirements Exploration
|
|
15
|
+
|
|
16
|
+
> **ARGUMENTS 처리**: 이 스킬이 `ARGUMENTS: <값>`과 함께 호출되면, 해당 값을 사용자 입력으로 취급하여
|
|
17
|
+
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
> OMC deep-interview + ouroboros 오마주. 모호성을 숫자로 측정하고 20% 미만까지 질문한다.
|
|
21
|
+
> "측정할 수 없으면 개선할 수 없다."
|
|
22
|
+
>
|
|
23
|
+
> **Gemini 위임**: 분석·점수 계산·산출물 초안은 Gemini CLI에 위임하여 Claude 토큰을 절약한다.
|
|
24
|
+
> 위임 패턴: `Bash("bash scripts/tfx-route.sh gemini exec '{prompt}'")`
|
|
25
|
+
|
|
26
|
+
## 위임 패턴
|
|
27
|
+
|
|
28
|
+
Claude와 Gemini의 역할을 분리하여 토큰을 최적화한다.
|
|
29
|
+
|
|
30
|
+
| 담당 | 작업 |
|
|
31
|
+
|------|------|
|
|
32
|
+
| **Claude** | AskUserQuestion (사용자 상호작용), 최종 파일 저장 |
|
|
33
|
+
| **Gemini** | 모호성 점수 계산, 질문 생성, 응답 분석, 산출물 초안 |
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 위임 호출 형태
|
|
37
|
+
Bash("bash scripts/tfx-route.sh gemini exec '{prompt}'")
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Gemini 실패 시 Fallback: Claude Opus가 분석을 직접 처리한다.
|
|
41
|
+
|
|
42
|
+
## 용도
|
|
43
|
+
|
|
44
|
+
- 구현 전 요구사항 명확화
|
|
45
|
+
- 모호한 요청을 정량적으로 분석하여 실행 가능한 수준으로 구체화
|
|
46
|
+
- 빠진 제약 조건, 성공 기준, 경계 조건을 체계적으로 발견
|
|
47
|
+
- 과잉 구현/과소 구현 방지
|
|
48
|
+
|
|
49
|
+
## 핵심: 모호성 점수 (Ambiguity Score)
|
|
50
|
+
|
|
51
|
+
요구사항의 모호성을 수학적으로 측정한다:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
ambiguity = 1 - (goal × 0.40 + constraints × 0.30 + criteria × 0.30)
|
|
55
|
+
|
|
56
|
+
각 요소 (0.0 ~ 1.0):
|
|
57
|
+
goal — 목표 명확도. "무엇을 달성하려는가?"가 명확한가?
|
|
58
|
+
constraints — 제약 조건 명확도. 범위, 기술 스택, 시간, 호환성 등
|
|
59
|
+
criteria — 성공 기준 명확도. "어떻게 되면 완료인가?"
|
|
60
|
+
|
|
61
|
+
예시:
|
|
62
|
+
입력: "인증 기능 추가해"
|
|
63
|
+
goal = 0.5 (인증이 무슨 인증? OAuth? JWT? 세션?)
|
|
64
|
+
constraints = 0.2 (기술 스택? 기존 시스템 연동?)
|
|
65
|
+
criteria = 0.1 (테스트? 성능? 보안 수준?)
|
|
66
|
+
ambiguity = 1 - (0.5×0.40 + 0.2×0.30 + 0.1×0.30) = 1 - 0.29 = 0.71 (71%)
|
|
67
|
+
|
|
68
|
+
목표: ambiguity < 0.20 (20% 미만)이 될 때까지 질문 반복.
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 워크플로우
|
|
72
|
+
|
|
73
|
+
### Step 1: 초기 모호성 평가
|
|
74
|
+
|
|
75
|
+
사용자 입력을 Gemini에 전달하여 초기 ambiguity score를 계산한다:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Claude → Gemini 위임
|
|
79
|
+
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}'")
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Gemini가 반환한 JSON에서 점수를 읽어 사용자에게 표시한다:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
출력 예시:
|
|
86
|
+
"📊 현재 모호성: 71%
|
|
87
|
+
- 목표: 50% 명확 (어떤 인증 방식?)
|
|
88
|
+
- 제약: 20% 명확 (기술 스택 미정)
|
|
89
|
+
- 기준: 10% 명확 (완료 조건 없음)
|
|
90
|
+
→ Stage 1: Clarify부터 시작합니다."
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Step 2: 5단계 인터뷰 (모호성 < 20%까지)
|
|
94
|
+
|
|
95
|
+
각 단계에서 Claude가 AskUserQuestion으로 질문하고, 사용자 응답을 Gemini에 전달하여 분석 및 다음 질문을 생성한다.
|
|
96
|
+
|
|
97
|
+
흐름: `Claude(질문) → 사용자(응답) → Gemini(분석+재계산) → Claude(다음 질문 제시)`
|
|
98
|
+
|
|
99
|
+
#### Stage 1: Clarify (명확화) — goal 개선
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
질문 방향:
|
|
103
|
+
- "정확히 무엇을 달성하려는가?"
|
|
104
|
+
- "이 작업의 범위는 어디까지인가?"
|
|
105
|
+
- "완료 후 어떤 상태가 되어야 하는가?"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# 응답 수집 후 Gemini에 분석 위임
|
|
110
|
+
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.'")
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
응답 후: Gemini JSON에서 goal 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
#### Stage 2: Decompose (분해) — constraints 개선
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
질문 방향:
|
|
121
|
+
- "이것을 어떤 하위 문제로 나눌 수 있는가?"
|
|
122
|
+
- "기술적 제약 조건은? (스택, 호환성, 성능)"
|
|
123
|
+
- "의존하는 외부 시스템이나 API는?"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 응답 수집 후 Gemini에 분석 위임
|
|
128
|
+
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.'")
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
응답 후: Gemini JSON에서 constraints 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### Stage 3: Challenge (반론) — 숨은 제약 발견
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
질문 방향:
|
|
139
|
+
- "이 접근의 약점은?"
|
|
140
|
+
- "실패할 수 있는 시나리오는?"
|
|
141
|
+
- "6개월 후 유지보수 관점에서 문제될 부분은?"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
# 응답 수집 후 Gemini에 분석 위임
|
|
146
|
+
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.'")
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
응답 후: Gemini JSON에서 constraints + criteria 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### Stage 4: Alternatives (대안) — criteria 정밀화
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
질문 방향:
|
|
157
|
+
- "다른 방법은 없는가?"
|
|
158
|
+
- "시간이 절반이라면 어떤 방식을 택하겠는가?"
|
|
159
|
+
- "각 대안의 trade-off는?"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
# 응답 수집 후 Gemini에 분석 위임
|
|
164
|
+
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.'")
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
응답 후: Gemini JSON에서 criteria 점수 읽기 → ambiguity 재계산 결과 사용자에게 표시
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### Stage 5: Synthesize (종합) — 최종 확인
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
질문 방향:
|
|
175
|
+
- "지금까지의 논의를 종합하면 최적 경로는?"
|
|
176
|
+
- "첫 번째로 실행할 단계는?"
|
|
177
|
+
- "이 결정에 대한 확신도는? (1-10)"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# 응답 수집 후 Gemini에 최종 분석 위임
|
|
182
|
+
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.'")
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
응답 후: Gemini JSON에서 전체 점수 읽기 → 최종 ambiguity score 사용자에게 표시
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Step 3: 조기 종료 판단
|
|
190
|
+
|
|
191
|
+
매 질문 후 ambiguity를 재계산하고, < 20%이면 남은 단계를 건너뛰고 종합 단계로 이동한다:
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
질문 후 재계산:
|
|
195
|
+
if ambiguity < 0.20:
|
|
196
|
+
→ "📊 모호성 {score}% — 충분히 명확합니다. 종합 단계로 이동합니다."
|
|
197
|
+
→ Step 4로 직행
|
|
198
|
+
elif ambiguity < 0.40:
|
|
199
|
+
→ "📊 모호성 {score}% — 거의 명확합니다. 핵심 질문 1-2개만 더."
|
|
200
|
+
else:
|
|
201
|
+
→ 다음 단계 진행
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Step 4: 산출물 생성
|
|
205
|
+
|
|
206
|
+
Gemini가 인터뷰 전체 컨텍스트를 바탕으로 구조화된 문서 초안을 생성하고, Claude가 파일로 저장한다:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Gemini에 산출물 초안 생성 위임
|
|
210
|
+
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.'")
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Claude는 Gemini가 반환한 마크다운을 Write 도구로 저장한다.
|
|
214
|
+
|
|
215
|
+
저장 위치: `.omc/plans/interview-{timestamp}.md`
|
|
216
|
+
|
|
217
|
+
산출물 형식:
|
|
218
|
+
|
|
219
|
+
```markdown
|
|
220
|
+
# Interview: {topic}
|
|
221
|
+
Date: {date} | Final Ambiguity: {score}%
|
|
222
|
+
|
|
223
|
+
## Ambiguity Breakdown
|
|
224
|
+
| 요소 | 초기 | 최종 | 개선 |
|
|
225
|
+
|------|------|------|------|
|
|
226
|
+
| Goal | {init}% | {final}% | +{delta}% |
|
|
227
|
+
| Constraints | {init}% | {final}% | +{delta}% |
|
|
228
|
+
| Criteria | {init}% | {final}% | +{delta}% |
|
|
229
|
+
|
|
230
|
+
## Goal
|
|
231
|
+
{1문장 목표}
|
|
232
|
+
|
|
233
|
+
## Constraints
|
|
234
|
+
{제약 조건 목록}
|
|
235
|
+
|
|
236
|
+
## Success Criteria
|
|
237
|
+
{성공 기준 목록}
|
|
238
|
+
|
|
239
|
+
## Risks & Challenges
|
|
240
|
+
{식별된 위험}
|
|
241
|
+
|
|
242
|
+
## Alternatives Considered
|
|
243
|
+
| 대안 | 장점 | 단점 | 채택 |
|
|
244
|
+
|------|------|------|------|
|
|
245
|
+
| ... | ... | ... | Y/N |
|
|
246
|
+
|
|
247
|
+
## Decision
|
|
248
|
+
{최종 결정 + 근거}
|
|
249
|
+
|
|
250
|
+
## Action Plan
|
|
251
|
+
1. {단계 1} → 검증: {check}
|
|
252
|
+
2. {단계 2} → 검증: {check}
|
|
253
|
+
3. ...
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## 동작 규칙
|
|
257
|
+
|
|
258
|
+
1. 각 단계에서 반드시 사용자 응답을 수집한 후 다음으로 이동한다.
|
|
259
|
+
2. 매 응답 후 ambiguity score를 재계산하여 진행률을 표시한다.
|
|
260
|
+
3. ambiguity < 20%이면 남은 단계를 건너뛰어도 된다.
|
|
261
|
+
4. 5단계를 모두 거쳐도 ambiguity >= 20%이면 추가 질문 라운드를 진행한다 (최대 2회).
|
|
262
|
+
5. 인터뷰 시작 시 코드베이스를 탐색하여 관련 컨텍스트를 확보한다.
|
|
263
|
+
6. 이전 단계 답변을 다음 단계 질문에 반영한다 (대화형 연결).
|
|
264
|
+
|
|
265
|
+
## 토큰 예산
|
|
266
|
+
|
|
267
|
+
| 단계 | Claude | Gemini |
|
|
268
|
+
|------|--------|--------|
|
|
269
|
+
| 초기 평가 (모호성 분석) | ~0.2K | ~1K |
|
|
270
|
+
| 5단계 인터뷰 (질문 제시) | ~1K | ~10K |
|
|
271
|
+
| 산출물 초안 생성 | — | ~2K |
|
|
272
|
+
| 최종 파일 저장 | ~0.5K | — |
|
|
273
|
+
| 코드베이스 탐색 | ~0.3K | — |
|
|
274
|
+
| **총합** | **~2K** | **~13K** |
|
|
275
|
+
|
|
276
|
+
Fallback: Gemini 호출 실패 시 Claude Opus가 분석을 직접 처리한다 (총합 ~15K).
|
|
277
|
+
|
|
278
|
+
## 사용 예
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
/tfx-interview "인증 시스템 리팩터링"
|
|
282
|
+
/tfx-interview "실시간 알림 기능 추가"
|
|
283
|
+
/요구사항 분석 "데이터 파이프라인 설계"
|
|
284
|
+
/인터뷰 "레거시 API를 REST에서 GraphQL로 마이그레이션"
|
|
285
|
+
```
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tfx-multi
|
|
3
|
+
description: >
|
|
4
|
+
멀티-CLI 팀 모드. Claude Native Agent Teams + Codex/Gemini 멀티모델 오케스트레이션.
|
|
5
|
+
'멀티로', '팀 모드', '다중 CLI', '3개 다 동원', 'multi' 같은 요청에 반드시 사용.
|
|
6
|
+
Claude+Codex+Gemini 협업이 필요한 모든 상황에 적극 활용.
|
|
7
|
+
triggers:
|
|
8
|
+
- tfx-multi
|
|
9
|
+
argument-hint: '"작업 설명" | --agents codex,gemini "작업" | --tmux "작업" | status | stop'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# tfx-multi v3 — 파이프라인 기반 멀티-CLI 팀 오케스트레이터
|
|
13
|
+
|
|
14
|
+
> **ARGUMENTS 처리**: 이 스킬이 `ARGUMENTS: <값>`과 함께 호출되면, 해당 값을 사용자 입력으로 취급하여
|
|
15
|
+
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
> **인프라**: 다른 스킬이 내부적으로 사용. 직접 호출할 필요 없음.
|
|
19
|
+
> Claude Code Native Teams의 Shift+Down 네비게이션을 복원한다.
|
|
20
|
+
> Codex/Gemini 워커마다 최소 프롬프트(~100 토큰)의 슬림 Agent 래퍼를 spawn하여 네비게이션에 등록하고,
|
|
21
|
+
> 실제 작업은 `tfx-route.sh`가 수행한다. task 상태는 `team_task_list`를 truth source로 검증한다.
|
|
22
|
+
> v3 — `--thorough`(기본: plan→prd→exec→verify→fix loop) + `--quick`(경량 모드).
|
|
23
|
+
|
|
24
|
+
> **Lead 고토큰 MCP 직접 사용 금지**
|
|
25
|
+
> Lead(Claude Opus)는 웹 서치(brave-search, exa, tavily), 외부 서비스(Notion, Jira/Confluence, Calendar, Gmail),
|
|
26
|
+
> 대량 조회를 직접 호출하지 않는다. Codex `scientist`/`document-specialist` 워커에 위임하면 Claude 토큰을 절약할 수 있다.
|
|
27
|
+
> 단건 조회(이슈 1개 확인 등)는 Lead 직접 허용하되, 3회 이상 반복 호출 시 위임 전환.
|
|
28
|
+
|
|
29
|
+
## 사용법
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/tfx-multi "인증 리팩터링 + UI 개선 + 보안 리뷰" # --thorough (기본)
|
|
33
|
+
/tfx-multi --quick "인증 리팩터링 + UI 개선 + 보안 리뷰" # 경량 모드 (plan/verify 생략)
|
|
34
|
+
/tfx-multi --agents codex,gemini "프론트+백엔드"
|
|
35
|
+
/tfx-multi --tmux "작업" # 레거시 tmux 모드
|
|
36
|
+
/tfx-multi status
|
|
37
|
+
/tfx-multi stop
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 실행 워크플로우
|
|
41
|
+
|
|
42
|
+
### Phase 0: 사전 점검 (출력 최소화 + 즉시 spawn)
|
|
43
|
+
|
|
44
|
+
preflight와 Agent 생성을 병렬로 실행하여 사용자 체감 지연을 최소화한다.
|
|
45
|
+
|
|
46
|
+
- **수동 모드:** Phase 1 파싱 → Phase 3a~3c(TeamCreate + Agent spawn) + Phase 0(preflight) **동시 병렬**
|
|
47
|
+
- **자동 모드:** Phase 0(preflight) + Phase 2(triage) **동시 병렬** → Phase 3
|
|
48
|
+
- 리드에는 요약 한 줄만 노출. 예: `preflight: ok (route/hub)`
|
|
49
|
+
- 권장 체크: `curl -sf http://127.0.0.1:27888/status >/dev/null && test -f ~/.claude/scripts/tfx-route.sh && echo "preflight: ok" || echo "preflight: FAIL"`
|
|
50
|
+
- 실패 시에만 상세 노출 (tfx-route.sh 없음, Hub 비정상, CLI 미설치)
|
|
51
|
+
|
|
52
|
+
### Phase 1: 입력 파싱
|
|
53
|
+
|
|
54
|
+
인자 없이 호출되면 "어떤 작업을 실행할까요?" 등으로 입력 요청. TeamCreate/Agent spawn을 시작하지 않는다.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
""(빈 문자열) → 사용자에게 작업 입력 요청
|
|
58
|
+
"3:codex 리뷰" → 수동 모드: N=3, agent=codex
|
|
59
|
+
"인증 + UI + 테스트" → 자동 모드 (--thorough 기본): Codex 분류 → Opus 분해 → Pipeline
|
|
60
|
+
"--quick 인증 + UI" → 경량 모드: plan/verify 생략, 즉시 실행
|
|
61
|
+
"--tmux 인증 + UI" → Phase 3-mux 분기
|
|
62
|
+
"status" / "stop" → Bash("node bin/triflux.mjs multi {cmd}") 직행
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**모드 결정:**
|
|
66
|
+
- `--quick` 명시 → quick 모드 (Phase 2.5-2.6, 3.5-3.7 생략)
|
|
67
|
+
- `--thorough` 명시 또는 플래그 없음 → thorough 모드 (기본, 전체 파이프라인)
|
|
68
|
+
- 커맨드 숏컷 (tfx-auto 경유 단일 실행) → quick 유지 (오버헤드 불필요)
|
|
69
|
+
|
|
70
|
+
### Phase 2: 트리아지 (tfx-auto와 동일)
|
|
71
|
+
|
|
72
|
+
**자동 모드:**
|
|
73
|
+
1. Codex `exec --skip-git-repo-check` 분류 → JSON `{parts: [{description, agent}]}`
|
|
74
|
+
2. Opus 인라인 분해 → 서브태스크 배열 `[{cli, subtask, role}]`
|
|
75
|
+
3. Codex 분류 실패 시 → Opus가 직접 분류+분해
|
|
76
|
+
|
|
77
|
+
**수동 모드:** Codex 분류 건너뜀 → Opus가 직접 N개 서브태스크 분해.
|
|
78
|
+
|
|
79
|
+
### Phase 2.5–2.6 + 3.5–3.7: 파이프라인 (기본)
|
|
80
|
+
|
|
81
|
+
> `--thorough`(기본) 모드에서 실행된다. `--quick` 플래그 시 건너뛴다.
|
|
82
|
+
> 상세는 → [`references/thorough-pipeline.md`](references/thorough-pipeline.md) 참조.
|
|
83
|
+
|
|
84
|
+
### Phase 3: Lead-Direct Headless 실행 (v6.0.0, 기본)
|
|
85
|
+
|
|
86
|
+
> **MANDATORY: CLI 워커는 headless 엔진으로 실행**
|
|
87
|
+
> CLI 워커(Codex/Gemini)는 반드시 아래 `Bash()` 명령으로 headless 엔진을 통해 실행한다.
|
|
88
|
+
> `Bash(tfx-route.sh)` 개별 호출이나 `Agent()` CLI 래핑은 PreToolUse 훅이 자동 차단/변환한다.
|
|
89
|
+
> headless 엔진이 psmux 세션 생성 → WT 자동 팝업 → CLI dispatch → 결과 수집을 전부 처리한다.
|
|
90
|
+
|
|
91
|
+
**실행 명령 (Lead가 호출하는 유일한 명령):**
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
Bash("tfx multi --teammate-mode headless --auto-attach --dashboard --assign 'codex:{프롬프트1}:{역할1}' --assign 'gemini:{프롬프트2}:{역할2}' --timeout 600")
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**예시:**
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
Bash("tfx multi --teammate-mode headless --auto-attach --dashboard --assign 'codex:코드 리뷰하고 개선 사항 제안:reviewer' --assign 'gemini:API 문서 작성:writer' --assign 'codex:보안 취약점 분석:security' --timeout 600")
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Claude 워커가 Read/Edit 필요한 경우 (하이브리드):**
|
|
104
|
+
|
|
105
|
+
Claude 워커는 headless에서 실행 불가 (Read/Edit 도구 필요). CLI 워커만 headless로 보내고 Claude 워커는 Agent로 병렬 실행.
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
# 1. CLI 워커를 headless로 dispatch
|
|
109
|
+
Bash("tfx multi --teammate-mode headless --auto-attach --dashboard --assign 'codex:{프롬프트}:{역할}' --assign 'gemini:{프롬프트}:{역할}' --timeout 600")
|
|
110
|
+
|
|
111
|
+
# 2. Claude 워커를 Agent로 병렬 실행 (headless Bash와 동시에 spawn)
|
|
112
|
+
Agent(subagent_type="...", prompt="...", run_in_background=true)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**결정 로직:**
|
|
116
|
+
```
|
|
117
|
+
if 모든 워커가 CLI (codex/gemini):
|
|
118
|
+
→ Bash("tfx multi --teammate-mode headless --auto-attach --dashboard --assign ...")
|
|
119
|
+
elif CLI + Claude 혼합:
|
|
120
|
+
→ CLI 워커: Bash("tfx multi --teammate-mode headless --auto-attach --dashboard --assign ...")
|
|
121
|
+
→ Claude 워커: Agent(subagent_type, run_in_background=true)
|
|
122
|
+
elif psmux 미설치:
|
|
123
|
+
→ Phase 3-fallback (아래)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**headless 엔진이 자동으로 수행하는 것:**
|
|
127
|
+
- psmux 세션 생성 + progressive split-window
|
|
128
|
+
- Windows Terminal 자동 팝업 (autoAttach)
|
|
129
|
+
- `--dashboard` TUI 대시보드 자동 표시 (headless-guard가 기본 주입)
|
|
130
|
+
- triflux 테마 적용 (Catppuccin Mocha status bar)
|
|
131
|
+
- 워커 요약 dashboard 스플릿
|
|
132
|
+
- CLI 명령 dispatch + 완료 토큰 폴링
|
|
133
|
+
- 결과 수집 + JSON stdout 출력
|
|
134
|
+
- 세션 정리
|
|
135
|
+
|
|
136
|
+
**출력 파싱:** headless 완료 후 stdout에 JSON 결과가 출력된다. 성공/실패 워커 수, 각 워커 출력을 파싱.
|
|
137
|
+
**크래시 복구:** 세션 사망 시 `{sessionDead: true}` 반환 (throw 대신).
|
|
138
|
+
**실수로 닫아도:** psmux 세션은 독립적. `psmux attach -t 세션이름`으로 재연결.
|
|
139
|
+
|
|
140
|
+
### Phase 4: 결과 수집 + 정리
|
|
141
|
+
|
|
142
|
+
headless stdout 출력에서 성공/실패 워커를 파싱.
|
|
143
|
+
실패 워커(`exitCode !== 0`)는 Claude fallback 재시도.
|
|
144
|
+
|
|
145
|
+
### Phase 3-fallback: Native Teams (psmux 미설치 시)
|
|
146
|
+
|
|
147
|
+
psmux가 없는 환경에서만 사용. Agent slim wrapper로 CLI를 실행.
|
|
148
|
+
`hub/team/native.mjs`의 `buildSlimWrapperPrompt()` 기반.
|
|
149
|
+
|
|
150
|
+
**팀 이름 생성 (`generateTeamName`):**
|
|
151
|
+
`tfx-${Date.now().toString(36).slice(-4)}${Math.random().toString(36).slice(2, 6)}`
|
|
152
|
+
타임스탬프 base36 끝 4자 + 난수 4자 조합. 예: `tfx-p1q2r3s4`.
|
|
153
|
+
|
|
154
|
+
> 래퍼 규칙 상세 → [`references/agent-wrapper-rules.md`](references/agent-wrapper-rules.md)
|
|
155
|
+
|
|
156
|
+
## 전제 조건
|
|
157
|
+
|
|
158
|
+
- **CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1** — `tfx setup`이 자동 설정
|
|
159
|
+
- **codex/gemini CLI** — 해당 에이전트 사용 시
|
|
160
|
+
- **Hub 활성 상태** — Named Pipe 우선, HTTP `127.0.0.1:27888` fallback. Hub 미실행 시 nativeProxy fallback.
|
|
161
|
+
|
|
162
|
+
## 에러 처리
|
|
163
|
+
|
|
164
|
+
| 에러 | 처리 |
|
|
165
|
+
|------|------|
|
|
166
|
+
| TeamCreate 실패 / Agent Teams 비활성 | `--psmux/--tmux` 폴백 |
|
|
167
|
+
| tfx-route.sh 없음 | `tfx setup` 실행 안내 |
|
|
168
|
+
| CLI 미설치 (codex/gemini) | claude 워커로 대체 |
|
|
169
|
+
| Codex 분류 실패 | Opus 직접 분류+분해 |
|
|
170
|
+
| Bash 실행 실패 | `completed` + `metadata.result: "failed"` 마킹 후 Claude fallback |
|
|
171
|
+
| claude fallback 실패 | 실패 목록/원인 요약 후 사용자 승인 대기 |
|
|
172
|
+
|
|
173
|
+
> TaskUpdate 상태값: `pending`, `in_progress`, `completed`, `deleted`만 지원. `failed` 사용 금지.
|
|
174
|
+
|
|
175
|
+
## 관련
|
|
176
|
+
|
|
177
|
+
| 항목 | 설명 |
|
|
178
|
+
|------|------|
|
|
179
|
+
| `scripts/tfx-route.sh` | 팀 통합 라우터 (v2.5: `--async`/`--job-wait`/`--job-status`/`--job-result`) |
|
|
180
|
+
| `hub/team/native.mjs` | Native Teams 래퍼 (프롬프트 템플릿) |
|
|
181
|
+
| `hub/pipeline/` | 파이프라인 상태 기계 (`--thorough` 모드) |
|
|
182
|
+
| `tfx-auto` | one-shot 실행 오케스트레이터 |
|
|
183
|
+
| `tfx-hub` | MCP 메시지 버스 관리 |
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tfx-multi",
|
|
3
3
|
"description": "멀티-CLI 팀 모드. Claude Native Agent Teams + Codex/Gemini 멀티모델 오케스트레이션. '멀티로', '팀 모드', '다중 CLI', '3개 다 동원', 'multi' 같은 요청에 반드시 사용. Claude+Codex+Gemini 협업이 필요한 모든 상황에 적극 활용.",
|
|
4
|
-
"triggers": [
|
|
5
|
-
"tfx-multi"
|
|
6
|
-
],
|
|
4
|
+
"triggers": ["tfx-multi"],
|
|
7
5
|
"argument_hint": "\"작업 설명\" | --agents codex,gemini \"작업\" | --tmux \"작업\" | status | stop"
|
|
8
6
|
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
---
|
|
2
|
+
internal: true
|
|
3
|
+
name: tfx-panel
|
|
4
|
+
description: "여러 전문가의 의견이 필요한 복잡한 결정에 사용한다. 'panel', '패널', '전문가 의견', 'expert panel', '다양한 관점', '전문가한테 물어봐' 같은 요청에 반드시 사용. 아키텍처, 보안, 비즈니스 전략 등 전문가 시뮬레이션이 필요할 때 적극 활용."
|
|
5
|
+
triggers:
|
|
6
|
+
- panel
|
|
7
|
+
- 패널
|
|
8
|
+
- 전문가 토론
|
|
9
|
+
- expert panel
|
|
10
|
+
- 전문가 패널
|
|
11
|
+
argument-hint: "<토론 주제>"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# {{SKILL_NAME}} — Virtual Expert Panel Simulation
|
|
15
|
+
|
|
16
|
+
> **ARGUMENTS 처리**: 이 스킬이 `ARGUMENTS: <값>`과 함께 호출되면, 해당 값을 사용자 입력으로 취급하여
|
|
17
|
+
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
> SuperClaude spec-panel + business-panel 오마주. 실제 전문가 5-10명의 관점을 시뮬레이션하여 다각적 분석.
|
|
21
|
+
> "한 사람의 시야는 좁다. 패널의 시야는 넓다."
|
|
22
|
+
|
|
23
|
+
## HARD RULES
|
|
24
|
+
|
|
25
|
+
> headless-guard가 이 규칙 위반을 **자동 차단**한다. 우회 불가.
|
|
26
|
+
|
|
27
|
+
1. **`codex exec` / `gemini -p` 직접 호출 절대 금지**
|
|
28
|
+
2. Codex·Gemini → `Bash("tfx multi --teammate-mode headless --auto-attach --dashboard --assign 'cli:프롬프트:역할' --timeout 600")` **만** 사용
|
|
29
|
+
3. Claude → `Agent(run_in_background=true)`
|
|
30
|
+
4. Bash + Agent를 같은 메시지에서 동시 호출하여 병렬 실행
|
|
31
|
+
|
|
32
|
+
## MODEL ROLES
|
|
33
|
+
|
|
34
|
+
| CLI | 역할 | 담당 전문가 유형 |
|
|
35
|
+
|-----|------|----------------|
|
|
36
|
+
| Claude (Opus) | 패널 모더레이터 + 인문/전략 전문가 | 리팩터링, 점진적 설계, 요구사항 |
|
|
37
|
+
| Codex | 기술 구현 전문가 | 아키텍처, 마이크로서비스, 클라우드 |
|
|
38
|
+
| Gemini | 통합/비즈니스 전문가 | 통합 패턴, 경쟁 전략, 프로덕트 |
|
|
39
|
+
|
|
40
|
+
## 전문가 풀
|
|
41
|
+
|
|
42
|
+
주제에 따라 5-10명을 자동 선정한다. 고정 풀이 아니라 주제 맥락에서 최적 전문가를 결정한다.
|
|
43
|
+
|
|
44
|
+
### 기술 전문가 (예시)
|
|
45
|
+
|
|
46
|
+
| 전문가 | 전문 분야 | 관점 |
|
|
47
|
+
|--------|----------|------|
|
|
48
|
+
| Martin Fowler | 리팩터링, 패턴 | 코드 설계 품질, 기술 부채 |
|
|
49
|
+
| Sam Newman | 마이크로서비스 | 서비스 경계, 분산 시스템 |
|
|
50
|
+
| Kent Beck | TDD, XP | 테스트, 점진적 설계 |
|
|
51
|
+
| Gregor Hohpe | 통합 패턴 | 메시징, 이벤트 아키텍처 |
|
|
52
|
+
| Brendan Burns | 클라우드 네이티브 | 컨테이너, 오케스트레이션 |
|
|
53
|
+
|
|
54
|
+
### 비즈니스/전략 전문가 (예시)
|
|
55
|
+
|
|
56
|
+
| 전문가 | 전문 분야 | 관점 |
|
|
57
|
+
|--------|----------|------|
|
|
58
|
+
| Michael Porter | 경쟁 전략 | 시장 포지셔닝, 가치 사슬 |
|
|
59
|
+
| Karl Wiegers | 요구사항 공학 | 요구사항 완전성, 우선순위 |
|
|
60
|
+
| Eric Ries | 린 스타트업 | MVP, 검증된 학습 |
|
|
61
|
+
| Marty Cagan | 프로덕트 | 가치, 실현 가능성, 비즈니스 |
|
|
62
|
+
|
|
63
|
+
## EXECUTION STEPS
|
|
64
|
+
|
|
65
|
+
### Step 0: 패널 도메인 선택
|
|
66
|
+
|
|
67
|
+
주제 인자가 없으면 사용자에게 도메인을 선택받는다:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
1. 소프트웨어 아키텍처 (Fowler, Newman, Vernon, Evans)
|
|
71
|
+
2. 보안 (OWASP, Trail of Bits, Schneier)
|
|
72
|
+
3. 비즈니스 전략 (Porter, Christensen, Drucker)
|
|
73
|
+
4. DevOps/SRE (Humble, Kim, Forsgren)
|
|
74
|
+
5. 프론트엔드/UX (Nielsen, Cooper, Krug)
|
|
75
|
+
6. 직접 구성
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
"직접 구성" 선택 시 사용자가 전문가 이름/역할을 직접 지정한다.
|
|
79
|
+
|
|
80
|
+
### Step 1: 주제 분석 및 전문가 선정
|
|
81
|
+
|
|
82
|
+
사용자 입력에서 주제를 파싱하고 관련 도메인을 식별한다. 5-10명의 전문가를 선정하여 3개 CLI에 분배한다.
|
|
83
|
+
|
|
84
|
+
분배 예시 (`"우리 모놀리스를 마이크로서비스로 전환해야 할까?"`):
|
|
85
|
+
- Claude 담당: Martin Fowler (리팩터링), Kent Beck (점진적 설계)
|
|
86
|
+
- Codex 담당: Sam Newman (마이크로서비스), Michael Porter (전략)
|
|
87
|
+
- Gemini 담당: Gregor Hohpe (통합 패턴), Karl Wiegers (요구사항)
|
|
88
|
+
|
|
89
|
+
주제가 모호하면 AskUserQuestion으로 명확화한다.
|
|
90
|
+
|
|
91
|
+
### Step 2: 독립 분석 (Anti-Herding)
|
|
92
|
+
|
|
93
|
+
**아래 2개 도구를 반드시 같은 응답에서 동시에 호출하라.**
|
|
94
|
+
|
|
95
|
+
Claude (Agent, background):
|
|
96
|
+
```
|
|
97
|
+
Agent(
|
|
98
|
+
subagent_type="claude-sonnet-4-5",
|
|
99
|
+
model="opus",
|
|
100
|
+
run_in_background=true,
|
|
101
|
+
prompt="당신은 {claude_expert_1}({role_1})과 {claude_expert_2}({role_2})입니다.
|
|
102
|
+
주제: {topic}
|
|
103
|
+
각 전문가의 고유 관점에서 독립적으로 분석하세요. 상대 전문가의 입장을 참조하지 마세요.
|
|
104
|
+
JSON 형식으로 응답:
|
|
105
|
+
{ 'experts': [{ 'name': string, 'position': string, 'reasoning': string, 'concerns': string[], 'recommendation': string, 'confidence': number }] }"
|
|
106
|
+
)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Codex + Gemini (Bash, background):
|
|
110
|
+
```
|
|
111
|
+
Bash("tfx multi --teammate-mode headless --auto-attach --dashboard \
|
|
112
|
+
--assign 'codex:당신은 {codex_expert_1}({role_3})과 {codex_expert_2}({role_4})입니다. 주제: {topic}. 각 전문가의 고유 관점에서 독립 분석. 상호 참조 금지. JSON: {experts:[{name,position,reasoning,concerns,recommendation,confidence}]}:analyst' \
|
|
113
|
+
--assign 'gemini:당신은 {gemini_expert_1}({role_5})과 {gemini_expert_2}({role_6})입니다. 주제: {topic}. 각 전문가의 고유 관점에서 독립 분석. 상호 참조 금지. JSON: {experts:[{name,position,reasoning,concerns,recommendation,confidence}]}:analyst' \
|
|
114
|
+
--timeout 600")
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Step 3: 패널 토론 시뮬레이션
|
|
118
|
+
|
|
119
|
+
3개 CLI 결과 수집 후 Claude Opus가 패널 모더레이터로 교차 토론을 시뮬레이션한다:
|
|
120
|
+
|
|
121
|
+
1. 각 전문가 의견 정리 — 합의점 / 분쟁점 식별
|
|
122
|
+
2. 분쟁점에 대해 가상 반론 생성:
|
|
123
|
+
- "{expert_A}은 {position_A}를 주장하지만, {expert_B}는 {position_B}를 권고합니다. {expert_A}의 반론은? {expert_B}의 재반론은?"
|
|
124
|
+
3. 2차 라운드: 반론을 반영한 수정 의견 도출
|
|
125
|
+
|
|
126
|
+
### Step 4: 합의 종합
|
|
127
|
+
|
|
128
|
+
tfx-consensus 프로토콜 적용:
|
|
129
|
+
|
|
130
|
+
- 과반(50%+) 합의 → "패널 합의" (근거 포함)
|
|
131
|
+
- 소수 의견 → "소수 견해" (근거 포함)
|
|
132
|
+
- 대립 → "미해결 쟁점" (양측 근거 병기)
|
|
133
|
+
|
|
134
|
+
### Step 5: 최종 패널 보고서 출력
|
|
135
|
+
|
|
136
|
+
```markdown
|
|
137
|
+
## 전문가 패널 보고서: {topic}
|
|
138
|
+
|
|
139
|
+
### 패널 구성
|
|
140
|
+
| # | 전문가 | 역할 | 핵심 입장 |
|
|
141
|
+
|---|--------|------|----------|
|
|
142
|
+
| 1 | {name} | {role} | {position} |
|
|
143
|
+
|
|
144
|
+
### 패널 합의 (Consensus Score: {score}%)
|
|
145
|
+
- [합의 1] — {N}/{total} 합의
|
|
146
|
+
- [합의 2] — {N}/{total} 합의
|
|
147
|
+
|
|
148
|
+
### 소수 견해
|
|
149
|
+
- {expert}: {dissenting_view} — 근거: {reason}
|
|
150
|
+
|
|
151
|
+
### 핵심 추천
|
|
152
|
+
{패널 종합 추천}
|
|
153
|
+
|
|
154
|
+
### 리스크 및 완화 방안
|
|
155
|
+
{전문가들이 식별한 리스크와 대응책}
|
|
156
|
+
|
|
157
|
+
### 미해결 쟁점
|
|
158
|
+
{패널 내 해소되지 않은 논쟁}
|
|
159
|
+
|
|
160
|
+
### 다음 단계 (Action Items)
|
|
161
|
+
1. {action_1}
|
|
162
|
+
2. {action_2}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## ERROR RECOVERY
|
|
166
|
+
|
|
167
|
+
- Codex/Gemini 타임아웃(600s 초과) → Claude Agent로 해당 전문가 재분석
|
|
168
|
+
- 결과 파싱 실패 → 원문 그대로 Step 3에 투입하여 모더레이터가 정리
|
|
169
|
+
- 전문가 선정 불확실 → AskUserQuestion으로 사용자 확인 후 진행
|
|
170
|
+
|
|
171
|
+
## TOKEN BUDGET
|
|
172
|
+
|
|
173
|
+
| 단계 | 토큰 |
|
|
174
|
+
|------|------|
|
|
175
|
+
| Step 1 (주제 분석 + 선정) | ~2K |
|
|
176
|
+
| Step 2 (3x 독립 분석) | ~15K |
|
|
177
|
+
| Step 3 (패널 토론) | ~8K |
|
|
178
|
+
| Step 4 (합의 종합) | ~2K |
|
|
179
|
+
| Step 5 (보고서) | ~3K |
|
|
180
|
+
| **총합** | **~30K** |
|
|
181
|
+
|
|
182
|
+
## 사용 예
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
/tfx-panel "우리 모놀리스를 마이크로서비스로 전환해야 할까?"
|
|
186
|
+
/tfx-panel "React vs Svelte vs Solid for our next frontend"
|
|
187
|
+
/tfx-panel "이 레거시 시스템의 리팩터링 전략"
|
|
188
|
+
/tfx-panel "B2B SaaS 가격 모델: 사용량 기반 vs 티어 기반"
|
|
189
|
+
```
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tfx-panel",
|
|
3
3
|
"description": "여러 전문가의 의견이 필요한 복잡한 결정에 사용한다. 'panel', '패널', '전문가 의견', 'expert panel', '다양한 관점', '전문가한테 물어봐' 같은 요청에 반드시 사용. 아키텍처, 보안, 비즈니스 전략 등 전문가 시뮬레이션이 필요할 때 적극 활용.",
|
|
4
|
-
"triggers": [
|
|
5
|
-
"panel",
|
|
6
|
-
"패널",
|
|
7
|
-
"전문가 토론",
|
|
8
|
-
"expert panel",
|
|
9
|
-
"전문가 패널"
|
|
10
|
-
],
|
|
4
|
+
"triggers": ["panel", "패널", "전문가 토론", "expert panel", "전문가 패널"],
|
|
11
5
|
"argument_hint": "<토론 주제>",
|
|
12
6
|
"internal": true
|
|
13
7
|
}
|