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
|
@@ -12,15 +12,15 @@
|
|
|
12
12
|
// after: [mcp_servers.context7]
|
|
13
13
|
// url = "http://127.0.0.1:8100/sse"
|
|
14
14
|
|
|
15
|
-
import { existsSync, readFileSync, writeFileSync
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { fileURLToPath } from
|
|
15
|
+
import { copyFileSync, existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
19
|
|
|
20
|
-
import { SERVERS } from
|
|
20
|
+
import { SERVERS } from "./mcp-gateway-start.mjs";
|
|
21
21
|
|
|
22
|
-
const CODEX_CONFIG = join(homedir(),
|
|
23
|
-
const BACKUP_SUFFIX =
|
|
22
|
+
const CODEX_CONFIG = join(homedir(), ".codex", "config.toml");
|
|
23
|
+
const BACKUP_SUFFIX = ".pre-gateway.bak";
|
|
24
24
|
|
|
25
25
|
// gateway 서버 → SSE URL 매핑
|
|
26
26
|
const GATEWAY_MAP = new Map(
|
|
@@ -28,9 +28,13 @@ const GATEWAY_MAP = new Map(
|
|
|
28
28
|
);
|
|
29
29
|
|
|
30
30
|
// stdio 정의를 보존해야 하는 MCP 서버 (gateway 대상 아님)
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const _KEEP_STDIO = new Set([
|
|
32
|
+
"omx_state",
|
|
33
|
+
"omx_memory",
|
|
34
|
+
"omx_code_intel",
|
|
35
|
+
"omx_trace",
|
|
36
|
+
"omx_team_run",
|
|
37
|
+
"tfx-hub",
|
|
34
38
|
]);
|
|
35
39
|
|
|
36
40
|
function parseTomlMcpServers(content) {
|
|
@@ -43,13 +47,21 @@ function parseTomlMcpServers(content) {
|
|
|
43
47
|
const startIdx = match.index + match[0].length;
|
|
44
48
|
|
|
45
49
|
// 다음 [section] 또는 파일 끝까지가 이 서버의 범위
|
|
46
|
-
const nextSection = content.indexOf(
|
|
47
|
-
const block = content
|
|
50
|
+
const nextSection = content.indexOf("\n[", startIdx);
|
|
51
|
+
const block = content
|
|
52
|
+
.slice(startIdx, nextSection === -1 ? undefined : nextSection)
|
|
53
|
+
.trim();
|
|
48
54
|
|
|
49
55
|
const hasUrl = /^url\s*=/m.test(block);
|
|
50
56
|
const hasCommand = /^command\s*=/m.test(block);
|
|
51
57
|
|
|
52
|
-
servers.set(name, {
|
|
58
|
+
servers.set(name, {
|
|
59
|
+
block,
|
|
60
|
+
hasUrl,
|
|
61
|
+
hasCommand,
|
|
62
|
+
startIdx,
|
|
63
|
+
headerIdx: match.index,
|
|
64
|
+
});
|
|
53
65
|
}
|
|
54
66
|
|
|
55
67
|
return servers;
|
|
@@ -59,7 +71,7 @@ function buildSseEntry(name, url) {
|
|
|
59
71
|
return `[mcp_servers.${name}]\nurl = "${url}"\n`;
|
|
60
72
|
}
|
|
61
73
|
|
|
62
|
-
function
|
|
74
|
+
function _buildStdioEntry(name, block) {
|
|
63
75
|
return `[mcp_servers.${name}]\n${block}\n`;
|
|
64
76
|
}
|
|
65
77
|
|
|
@@ -67,11 +79,11 @@ function buildStdioEntry(name, block) {
|
|
|
67
79
|
|
|
68
80
|
export function enableGateway() {
|
|
69
81
|
if (!existsSync(CODEX_CONFIG)) {
|
|
70
|
-
console.log(
|
|
82
|
+
console.log("[SKIP] ~/.codex/config.toml not found");
|
|
71
83
|
return { changed: 0, skipped: 0 };
|
|
72
84
|
}
|
|
73
85
|
|
|
74
|
-
const original = readFileSync(CODEX_CONFIG,
|
|
86
|
+
const original = readFileSync(CODEX_CONFIG, "utf8");
|
|
75
87
|
const servers = parseTomlMcpServers(original);
|
|
76
88
|
|
|
77
89
|
// 백업 (최초 1회만)
|
|
@@ -113,18 +125,22 @@ export function enableGateway() {
|
|
|
113
125
|
}
|
|
114
126
|
|
|
115
127
|
// preflight MCP 서버 등록 — Codex 시작 시 gateway 자동 기동 보장
|
|
116
|
-
const preflightName =
|
|
128
|
+
const preflightName = "tfx-gateway-preflight";
|
|
117
129
|
if (!servers.has(preflightName)) {
|
|
118
|
-
const resolvedPath = join(
|
|
119
|
-
.
|
|
130
|
+
const resolvedPath = join(
|
|
131
|
+
dirname(fileURLToPath(import.meta.url)),
|
|
132
|
+
"codex-gateway-preflight.mjs",
|
|
133
|
+
).replace(/\\/g, "\\\\");
|
|
120
134
|
content += `\n[mcp_servers.${preflightName}]\ncommand = "node"\nargs = ["${resolvedPath}"]\nenabled = true\nstartup_timeout_sec = 10\n`;
|
|
121
135
|
changed++;
|
|
122
136
|
console.log(`[ADD] ${preflightName} — Codex 시작 시 gateway 자동 기동`);
|
|
123
137
|
}
|
|
124
138
|
|
|
125
139
|
if (changed > 0) {
|
|
126
|
-
writeFileSync(CODEX_CONFIG, content,
|
|
127
|
-
console.log(
|
|
140
|
+
writeFileSync(CODEX_CONFIG, content, "utf8");
|
|
141
|
+
console.log(
|
|
142
|
+
`\n[DONE] ${changed} servers converted, ${skipped} already SSE`,
|
|
143
|
+
);
|
|
128
144
|
} else {
|
|
129
145
|
console.log(`\n[DONE] No changes needed (${skipped} already SSE)`);
|
|
130
146
|
}
|
|
@@ -137,12 +153,12 @@ export function enableGateway() {
|
|
|
137
153
|
export function disableGateway() {
|
|
138
154
|
const backupPath = CODEX_CONFIG + BACKUP_SUFFIX;
|
|
139
155
|
if (!existsSync(backupPath)) {
|
|
140
|
-
console.log(
|
|
156
|
+
console.log("[SKIP] No backup found — nothing to restore");
|
|
141
157
|
return false;
|
|
142
158
|
}
|
|
143
159
|
|
|
144
160
|
copyFileSync(backupPath, CODEX_CONFIG);
|
|
145
|
-
console.log(
|
|
161
|
+
console.log("[RESTORE] config.toml restored from pre-gateway backup");
|
|
146
162
|
return true;
|
|
147
163
|
}
|
|
148
164
|
|
|
@@ -153,18 +169,18 @@ export function getStatus() {
|
|
|
153
169
|
return { exists: false, servers: [] };
|
|
154
170
|
}
|
|
155
171
|
|
|
156
|
-
const content = readFileSync(CODEX_CONFIG,
|
|
172
|
+
const content = readFileSync(CODEX_CONFIG, "utf8");
|
|
157
173
|
const servers = parseTomlMcpServers(content);
|
|
158
174
|
const result = [];
|
|
159
175
|
|
|
160
176
|
for (const [name, url] of GATEWAY_MAP) {
|
|
161
177
|
const srv = servers.get(name);
|
|
162
178
|
if (!srv) {
|
|
163
|
-
result.push({ name, mode:
|
|
179
|
+
result.push({ name, mode: "missing", url });
|
|
164
180
|
} else if (srv.hasUrl) {
|
|
165
|
-
result.push({ name, mode:
|
|
181
|
+
result.push({ name, mode: "sse", url });
|
|
166
182
|
} else {
|
|
167
|
-
result.push({ name, mode:
|
|
183
|
+
result.push({ name, mode: "stdio", url });
|
|
168
184
|
}
|
|
169
185
|
}
|
|
170
186
|
|
|
@@ -175,25 +191,29 @@ export function getStatus() {
|
|
|
175
191
|
|
|
176
192
|
const arg = process.argv[2];
|
|
177
193
|
|
|
178
|
-
if (arg ===
|
|
194
|
+
if (arg === "--enable") {
|
|
179
195
|
enableGateway();
|
|
180
|
-
} else if (arg ===
|
|
196
|
+
} else if (arg === "--disable") {
|
|
181
197
|
disableGateway();
|
|
182
|
-
} else if (arg ===
|
|
198
|
+
} else if (arg === "--status") {
|
|
183
199
|
const { exists, servers } = getStatus();
|
|
184
200
|
if (!exists) {
|
|
185
|
-
console.log(
|
|
201
|
+
console.log("config.toml not found");
|
|
186
202
|
process.exit(1);
|
|
187
203
|
}
|
|
188
|
-
console.log(
|
|
189
|
-
console.log(
|
|
204
|
+
console.log("\nCodex MCP Gateway Status:");
|
|
205
|
+
console.log("─".repeat(50));
|
|
190
206
|
for (const s of servers) {
|
|
191
|
-
const icon = s.mode ===
|
|
192
|
-
console.log(
|
|
207
|
+
const icon = s.mode === "sse" ? "✅" : s.mode === "stdio" ? "⚠️" : "❌";
|
|
208
|
+
console.log(
|
|
209
|
+
`${icon} ${s.name.padEnd(15)} ${s.mode.padEnd(8)} ${s.mode === "stdio" ? "← zombie risk" : ""}`,
|
|
210
|
+
);
|
|
193
211
|
}
|
|
194
212
|
} else {
|
|
195
|
-
console.log(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
console.log(
|
|
213
|
+
console.log(
|
|
214
|
+
"Usage: codex-mcp-gateway-sync.mjs [--enable|--disable|--status]",
|
|
215
|
+
);
|
|
216
|
+
console.log(" --enable Convert stdio MCP servers to SSE gateway URLs");
|
|
217
|
+
console.log(" --disable Restore original stdio config from backup");
|
|
218
|
+
console.log(" --status Show current MCP connection mode per server");
|
|
199
219
|
}
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Installation: source /path/to/tfx.bash 또는 ~/.bashrc에 추가
|
|
3
|
-
|
|
4
|
-
_tfx_completion() {
|
|
5
|
-
local cur prev words cword
|
|
6
|
-
COMPREPLY=()
|
|
7
|
-
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
8
|
-
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
9
|
-
words=("${COMP_WORDS[@]}")
|
|
10
|
-
cword=$COMP_CWORD
|
|
11
|
-
|
|
12
|
-
local commands="setup doctor multi hub auto codex gemini"
|
|
13
|
-
local multi_cmds="status stop kill attach list"
|
|
14
|
-
local hub_cmds="start stop status restart"
|
|
15
|
-
local flags="--thorough --quick --tmux --psmux --agents --no-attach --timeout"
|
|
16
|
-
|
|
17
|
-
if [[ $cword -eq 1 ]]; then
|
|
18
|
-
COMPREPLY=( $(compgen -W "${commands}" -- "$cur") )
|
|
19
|
-
return 0
|
|
20
|
-
fi
|
|
21
|
-
|
|
22
|
-
local cmd="${words[1]}"
|
|
23
|
-
case "${cmd}" in
|
|
24
|
-
multi)
|
|
25
|
-
if [[ $cword -eq 2 && ! "$cur" == -* ]]; then
|
|
26
|
-
COMPREPLY=( $(compgen -W "${multi_cmds}" -- "$cur") )
|
|
27
|
-
else
|
|
28
|
-
COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
|
|
29
|
-
fi
|
|
30
|
-
;;
|
|
31
|
-
hub)
|
|
32
|
-
if [[ $cword -eq 2 ]]; then
|
|
33
|
-
COMPREPLY=( $(compgen -W "${hub_cmds}" -- "$cur") )
|
|
34
|
-
fi
|
|
35
|
-
;;
|
|
36
|
-
doctor)
|
|
37
|
-
COMPREPLY=( $(compgen -W "--fix --reset" -- "$cur") )
|
|
38
|
-
;;
|
|
39
|
-
setup|auto|codex|gemini)
|
|
40
|
-
if [[ "$cur" == -* ]]; then
|
|
41
|
-
COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
|
|
42
|
-
fi
|
|
43
|
-
;;
|
|
44
|
-
esac
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
complete -F _tfx_completion tfx
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Installation: source /path/to/tfx.bash 또는 ~/.bashrc에 추가
|
|
3
|
+
|
|
4
|
+
_tfx_completion() {
|
|
5
|
+
local cur prev words cword
|
|
6
|
+
COMPREPLY=()
|
|
7
|
+
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
8
|
+
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
9
|
+
words=("${COMP_WORDS[@]}")
|
|
10
|
+
cword=$COMP_CWORD
|
|
11
|
+
|
|
12
|
+
local commands="setup doctor multi hub auto codex gemini"
|
|
13
|
+
local multi_cmds="status stop kill attach list"
|
|
14
|
+
local hub_cmds="start stop status restart"
|
|
15
|
+
local flags="--thorough --quick --tmux --psmux --agents --no-attach --timeout"
|
|
16
|
+
|
|
17
|
+
if [[ $cword -eq 1 ]]; then
|
|
18
|
+
COMPREPLY=( $(compgen -W "${commands}" -- "$cur") )
|
|
19
|
+
return 0
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
local cmd="${words[1]}"
|
|
23
|
+
case "${cmd}" in
|
|
24
|
+
multi)
|
|
25
|
+
if [[ $cword -eq 2 && ! "$cur" == -* ]]; then
|
|
26
|
+
COMPREPLY=( $(compgen -W "${multi_cmds}" -- "$cur") )
|
|
27
|
+
else
|
|
28
|
+
COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
|
|
29
|
+
fi
|
|
30
|
+
;;
|
|
31
|
+
hub)
|
|
32
|
+
if [[ $cword -eq 2 ]]; then
|
|
33
|
+
COMPREPLY=( $(compgen -W "${hub_cmds}" -- "$cur") )
|
|
34
|
+
fi
|
|
35
|
+
;;
|
|
36
|
+
doctor)
|
|
37
|
+
COMPREPLY=( $(compgen -W "--fix --reset" -- "$cur") )
|
|
38
|
+
;;
|
|
39
|
+
setup|auto|codex|gemini)
|
|
40
|
+
if [[ "$cur" == -* ]]; then
|
|
41
|
+
COMPREPLY=( $(compgen -W "${flags}" -- "$cur") )
|
|
42
|
+
fi
|
|
43
|
+
;;
|
|
44
|
+
esac
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
complete -F _tfx_completion tfx
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
# Installation: ~/.config/fish/completions/에 복사
|
|
2
|
-
# e.g., cp /path/to/tfx.fish ~/.config/fish/completions/tfx.fish
|
|
3
|
-
|
|
4
|
-
set -l commands setup doctor multi hub auto codex gemini
|
|
5
|
-
set -l multi_cmds status stop kill attach list
|
|
6
|
-
set -l hub_cmds start stop status restart
|
|
7
|
-
|
|
8
|
-
complete -c tfx -f
|
|
9
|
-
|
|
10
|
-
# Subcommands
|
|
11
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "setup" -d "Setup and sync files"
|
|
12
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "doctor" -d "Diagnose CLI and issues"
|
|
13
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "multi" -d "Multi-CLI team mode"
|
|
14
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "hub" -d "MCP message bus management"
|
|
15
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "auto" -d "Auto mode"
|
|
16
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "codex" -d "Codex mode"
|
|
17
|
-
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "gemini" -d "Gemini mode"
|
|
18
|
-
|
|
19
|
-
# Doctor flags
|
|
20
|
-
complete -c tfx -n "__fish_seen_subcommand_from doctor" -l fix -d "Auto fix issues"
|
|
21
|
-
complete -c tfx -n "__fish_seen_subcommand_from doctor" -l reset -d "Reset all caches"
|
|
22
|
-
|
|
23
|
-
# Multi subcommands
|
|
24
|
-
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "status"
|
|
25
|
-
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "stop"
|
|
26
|
-
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "kill"
|
|
27
|
-
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "attach"
|
|
28
|
-
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "list"
|
|
29
|
-
|
|
30
|
-
# Hub subcommands
|
|
31
|
-
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "start"
|
|
32
|
-
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "stop"
|
|
33
|
-
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "status"
|
|
34
|
-
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "restart"
|
|
35
|
-
|
|
36
|
-
# Global or multi flags
|
|
37
|
-
set -l flags_cond "__fish_seen_subcommand_from setup multi auto codex gemini"
|
|
38
|
-
complete -c tfx -n "$flags_cond" -l thorough -d "Thorough execution"
|
|
39
|
-
complete -c tfx -n "$flags_cond" -l quick -d "Quick execution"
|
|
40
|
-
complete -c tfx -n "$flags_cond" -l tmux -d "Use tmux"
|
|
41
|
-
complete -c tfx -n "$flags_cond" -l psmux -d "Use psmux"
|
|
42
|
-
complete -c tfx -n "$flags_cond" -l agents -d "Specify agents"
|
|
43
|
-
complete -c tfx -n "$flags_cond" -l no-attach -d "Do not attach"
|
|
44
|
-
complete -c tfx -n "$flags_cond" -l timeout -d "Set timeout"
|
|
1
|
+
# Installation: ~/.config/fish/completions/에 복사
|
|
2
|
+
# e.g., cp /path/to/tfx.fish ~/.config/fish/completions/tfx.fish
|
|
3
|
+
|
|
4
|
+
set -l commands setup doctor multi hub auto codex gemini
|
|
5
|
+
set -l multi_cmds status stop kill attach list
|
|
6
|
+
set -l hub_cmds start stop status restart
|
|
7
|
+
|
|
8
|
+
complete -c tfx -f
|
|
9
|
+
|
|
10
|
+
# Subcommands
|
|
11
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "setup" -d "Setup and sync files"
|
|
12
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "doctor" -d "Diagnose CLI and issues"
|
|
13
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "multi" -d "Multi-CLI team mode"
|
|
14
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "hub" -d "MCP message bus management"
|
|
15
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "auto" -d "Auto mode"
|
|
16
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "codex" -d "Codex mode"
|
|
17
|
+
complete -c tfx -n "not __fish_seen_subcommand_from $commands" -a "gemini" -d "Gemini mode"
|
|
18
|
+
|
|
19
|
+
# Doctor flags
|
|
20
|
+
complete -c tfx -n "__fish_seen_subcommand_from doctor" -l fix -d "Auto fix issues"
|
|
21
|
+
complete -c tfx -n "__fish_seen_subcommand_from doctor" -l reset -d "Reset all caches"
|
|
22
|
+
|
|
23
|
+
# Multi subcommands
|
|
24
|
+
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "status"
|
|
25
|
+
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "stop"
|
|
26
|
+
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "kill"
|
|
27
|
+
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "attach"
|
|
28
|
+
complete -c tfx -n "__fish_seen_subcommand_from multi; and not __fish_seen_subcommand_from $multi_cmds" -a "list"
|
|
29
|
+
|
|
30
|
+
# Hub subcommands
|
|
31
|
+
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "start"
|
|
32
|
+
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "stop"
|
|
33
|
+
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "status"
|
|
34
|
+
complete -c tfx -n "__fish_seen_subcommand_from hub; and not __fish_seen_subcommand_from $hub_cmds" -a "restart"
|
|
35
|
+
|
|
36
|
+
# Global or multi flags
|
|
37
|
+
set -l flags_cond "__fish_seen_subcommand_from setup multi auto codex gemini"
|
|
38
|
+
complete -c tfx -n "$flags_cond" -l thorough -d "Thorough execution"
|
|
39
|
+
complete -c tfx -n "$flags_cond" -l quick -d "Quick execution"
|
|
40
|
+
complete -c tfx -n "$flags_cond" -l tmux -d "Use tmux"
|
|
41
|
+
complete -c tfx -n "$flags_cond" -l psmux -d "Use psmux"
|
|
42
|
+
complete -c tfx -n "$flags_cond" -l agents -d "Specify agents"
|
|
43
|
+
complete -c tfx -n "$flags_cond" -l no-attach -d "Do not attach"
|
|
44
|
+
complete -c tfx -n "$flags_cond" -l timeout -d "Set timeout"
|
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
#compdef tfx
|
|
2
|
-
# Installation: fpath에 추가 후 compinit
|
|
3
|
-
# e.g., fpath=(/path/to/dir $fpath) && compinit
|
|
4
|
-
|
|
5
|
-
_tfx() {
|
|
6
|
-
local line state
|
|
7
|
-
local -a commands multi_cmds hub_cmds flags
|
|
8
|
-
|
|
9
|
-
commands=(
|
|
10
|
-
'setup:Setup and sync files'
|
|
11
|
-
'doctor:Diagnose CLI and issues'
|
|
12
|
-
'multi:Multi-CLI team mode'
|
|
13
|
-
'hub:MCP message bus management'
|
|
14
|
-
'auto:Auto mode'
|
|
15
|
-
'codex:Codex mode'
|
|
16
|
-
'gemini:Gemini mode'
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
multi_cmds=(
|
|
20
|
-
'status:Show status'
|
|
21
|
-
'stop:Stop multi'
|
|
22
|
-
'kill:Kill multi'
|
|
23
|
-
'attach:Attach to multi'
|
|
24
|
-
'list:List multi sessions'
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
hub_cmds=(
|
|
28
|
-
'start:Start hub'
|
|
29
|
-
'stop:Stop hub'
|
|
30
|
-
'status:Show hub status'
|
|
31
|
-
'restart:Restart hub'
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
_arguments -C \
|
|
35
|
-
'1: :->cmds' \
|
|
36
|
-
'*: :->args'
|
|
37
|
-
|
|
38
|
-
case $state in
|
|
39
|
-
cmds)
|
|
40
|
-
_describe -t commands 'tfx commands' commands
|
|
41
|
-
;;
|
|
42
|
-
args)
|
|
43
|
-
case $words[2] in
|
|
44
|
-
multi)
|
|
45
|
-
if (( CURRENT == 3 )) && [[ $words[CURRENT] != -* ]]; then
|
|
46
|
-
_describe -t multi_cmds 'multi commands' multi_cmds
|
|
47
|
-
else
|
|
48
|
-
_arguments \
|
|
49
|
-
'--thorough[Thorough execution]' \
|
|
50
|
-
'--quick[Quick execution]' \
|
|
51
|
-
'--tmux[Use tmux]' \
|
|
52
|
-
'--psmux[Use psmux]' \
|
|
53
|
-
'--agents[Specify agents]' \
|
|
54
|
-
'--no-attach[Do not attach]' \
|
|
55
|
-
'--timeout[Set timeout]'
|
|
56
|
-
fi
|
|
57
|
-
;;
|
|
58
|
-
hub)
|
|
59
|
-
if (( CURRENT == 3 )); then
|
|
60
|
-
_describe -t hub_cmds 'hub commands' hub_cmds
|
|
61
|
-
fi
|
|
62
|
-
;;
|
|
63
|
-
doctor)
|
|
64
|
-
_arguments \
|
|
65
|
-
'--fix[Auto fix issues]' \
|
|
66
|
-
'--reset[Reset all caches]'
|
|
67
|
-
;;
|
|
68
|
-
*)
|
|
69
|
-
_arguments \
|
|
70
|
-
'--thorough[Thorough execution]' \
|
|
71
|
-
'--quick[Quick execution]' \
|
|
72
|
-
'--tmux[Use tmux]' \
|
|
73
|
-
'--psmux[Use psmux]' \
|
|
74
|
-
'--agents[Specify agents]' \
|
|
75
|
-
'--no-attach[Do not attach]' \
|
|
76
|
-
'--timeout[Set timeout]'
|
|
77
|
-
;;
|
|
78
|
-
esac
|
|
79
|
-
;;
|
|
80
|
-
esac
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
_tfx "$@"
|
|
1
|
+
#compdef tfx
|
|
2
|
+
# Installation: fpath에 추가 후 compinit
|
|
3
|
+
# e.g., fpath=(/path/to/dir $fpath) && compinit
|
|
4
|
+
|
|
5
|
+
_tfx() {
|
|
6
|
+
local line state
|
|
7
|
+
local -a commands multi_cmds hub_cmds flags
|
|
8
|
+
|
|
9
|
+
commands=(
|
|
10
|
+
'setup:Setup and sync files'
|
|
11
|
+
'doctor:Diagnose CLI and issues'
|
|
12
|
+
'multi:Multi-CLI team mode'
|
|
13
|
+
'hub:MCP message bus management'
|
|
14
|
+
'auto:Auto mode'
|
|
15
|
+
'codex:Codex mode'
|
|
16
|
+
'gemini:Gemini mode'
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
multi_cmds=(
|
|
20
|
+
'status:Show status'
|
|
21
|
+
'stop:Stop multi'
|
|
22
|
+
'kill:Kill multi'
|
|
23
|
+
'attach:Attach to multi'
|
|
24
|
+
'list:List multi sessions'
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
hub_cmds=(
|
|
28
|
+
'start:Start hub'
|
|
29
|
+
'stop:Stop hub'
|
|
30
|
+
'status:Show hub status'
|
|
31
|
+
'restart:Restart hub'
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
_arguments -C \
|
|
35
|
+
'1: :->cmds' \
|
|
36
|
+
'*: :->args'
|
|
37
|
+
|
|
38
|
+
case $state in
|
|
39
|
+
cmds)
|
|
40
|
+
_describe -t commands 'tfx commands' commands
|
|
41
|
+
;;
|
|
42
|
+
args)
|
|
43
|
+
case $words[2] in
|
|
44
|
+
multi)
|
|
45
|
+
if (( CURRENT == 3 )) && [[ $words[CURRENT] != -* ]]; then
|
|
46
|
+
_describe -t multi_cmds 'multi commands' multi_cmds
|
|
47
|
+
else
|
|
48
|
+
_arguments \
|
|
49
|
+
'--thorough[Thorough execution]' \
|
|
50
|
+
'--quick[Quick execution]' \
|
|
51
|
+
'--tmux[Use tmux]' \
|
|
52
|
+
'--psmux[Use psmux]' \
|
|
53
|
+
'--agents[Specify agents]' \
|
|
54
|
+
'--no-attach[Do not attach]' \
|
|
55
|
+
'--timeout[Set timeout]'
|
|
56
|
+
fi
|
|
57
|
+
;;
|
|
58
|
+
hub)
|
|
59
|
+
if (( CURRENT == 3 )); then
|
|
60
|
+
_describe -t hub_cmds 'hub commands' hub_cmds
|
|
61
|
+
fi
|
|
62
|
+
;;
|
|
63
|
+
doctor)
|
|
64
|
+
_arguments \
|
|
65
|
+
'--fix[Auto fix issues]' \
|
|
66
|
+
'--reset[Reset all caches]'
|
|
67
|
+
;;
|
|
68
|
+
*)
|
|
69
|
+
_arguments \
|
|
70
|
+
'--thorough[Thorough execution]' \
|
|
71
|
+
'--quick[Quick execution]' \
|
|
72
|
+
'--tmux[Use tmux]' \
|
|
73
|
+
'--psmux[Use psmux]' \
|
|
74
|
+
'--agents[Specify agents]' \
|
|
75
|
+
'--no-attach[Do not attach]' \
|
|
76
|
+
'--timeout[Set timeout]'
|
|
77
|
+
;;
|
|
78
|
+
esac
|
|
79
|
+
;;
|
|
80
|
+
esac
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
_tfx "$@"
|