triflux 10.3.4 → 10.4.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.
Files changed (120) hide show
  1. package/CLAUDE.md +193 -0
  2. package/LICENSE +21 -21
  3. package/hooks/hook-registry.json +256 -256
  4. package/hub/adaptive-inject.mjs +1 -1
  5. package/hub/assign-callbacks.mjs +120 -120
  6. package/hub/delegator/index.mjs +14 -14
  7. package/hub/delegator/tool-definitions.mjs +35 -35
  8. package/hub/hitl.mjs +143 -143
  9. package/hub/router.mjs +791 -791
  10. package/hub/session-fingerprint.mjs +1 -1
  11. package/hub/team/cli/commands/attach.mjs +37 -37
  12. package/hub/team/cli/commands/debug.mjs +74 -74
  13. package/hub/team/cli/commands/focus.mjs +53 -53
  14. package/hub/team/cli/commands/list.mjs +24 -24
  15. package/hub/team/cli/commands/start/start-in-process.mjs +40 -40
  16. package/hub/team/cli/commands/start/start-mux.mjs +73 -73
  17. package/hub/team/cli/commands/start/start-wt.mjs +69 -69
  18. package/hub/team/cli/commands/tasks.mjs +13 -13
  19. package/hub/team/cli/render.mjs +30 -30
  20. package/hub/team/cli/services/attach-fallback.mjs +54 -54
  21. package/hub/team/cli/services/member-selector.mjs +30 -30
  22. package/hub/team/cli/services/native-control.mjs +116 -116
  23. package/hub/team/cli/services/task-model.mjs +30 -30
  24. package/hub/team/notify.mjs +1 -1
  25. package/hub/team/orchestrator.mjs +161 -161
  26. package/hub/team/session.mjs +611 -611
  27. package/hub/team/shared.mjs +13 -13
  28. package/hub/tray.mjs +368 -368
  29. package/hub/workers/codex-mcp.mjs +507 -507
  30. package/hub/workers/factory.mjs +21 -21
  31. package/package.json +21 -55
  32. package/references/hosts.json +33 -0
  33. package/scripts/completions/tfx.bash +47 -47
  34. package/scripts/completions/tfx.fish +44 -44
  35. package/scripts/completions/tfx.zsh +83 -83
  36. package/scripts/hub-ensure.mjs +120 -120
  37. package/scripts/keyword-detector.mjs +272 -272
  38. package/scripts/keyword-rules-expander.mjs +521 -521
  39. package/scripts/lib/mcp-server-catalog.mjs +118 -118
  40. package/scripts/notion-read.mjs +553 -553
  41. package/scripts/test-tfx-route-no-claude-native.mjs +57 -57
  42. package/scripts/tfx-batch-stats.mjs +96 -96
  43. package/skills/.omc/state/agent-replay-8f0e10a9-9693-4410-96f5-a6b07e8ed995.jsonl +1 -0
  44. package/skills/.omc/state/idle-notif-cooldown.json +3 -0
  45. package/skills/.omc/state/last-tool-error.json +7 -0
  46. package/skills/.omc/state/subagent-tracking.json +7 -0
  47. package/skills/tfx-remote-spawn/references/hosts.json +16 -0
  48. package/skills/tfx-workspace/async-tests/run-tests.sh +203 -0
  49. package/skills/tfx-workspace/evals/evals.json +79 -0
  50. package/skills/tfx-workspace/iteration-1/benchmark.json +162 -0
  51. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/eval_metadata.json +11 -0
  52. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/grading.json +9 -0
  53. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/outputs/analysis.md +154 -0
  54. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/timing.json +5 -0
  55. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/grading.json +9 -0
  56. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/outputs/analysis.md +126 -0
  57. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/timing.json +5 -0
  58. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/eval_metadata.json +11 -0
  59. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/grading.json +9 -0
  60. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/outputs/analysis.md +119 -0
  61. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/timing.json +5 -0
  62. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/grading.json +9 -0
  63. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/outputs/analysis.md +115 -0
  64. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/timing.json +5 -0
  65. package/skills/tfx-workspace/iteration-1/hub-start-sequence/eval_metadata.json +10 -0
  66. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/grading.json +8 -0
  67. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/outputs/analysis.md +86 -0
  68. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/timing.json +5 -0
  69. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/grading.json +8 -0
  70. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/outputs/analysis.md +81 -0
  71. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/timing.json +5 -0
  72. package/skills/tfx-workspace/iteration-1/multi-team-creation/eval_metadata.json +12 -0
  73. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/grading.json +10 -0
  74. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/outputs/analysis.md +316 -0
  75. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/timing.json +5 -0
  76. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/grading.json +10 -0
  77. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/outputs/analysis.md +352 -0
  78. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/timing.json +5 -0
  79. package/skills/tfx-workspace/iteration-1/review.html +1325 -0
  80. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/eval_metadata.json +12 -0
  81. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/grading.json +10 -0
  82. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/outputs/analysis.md +97 -0
  83. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/timing.json +5 -0
  84. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/grading.json +10 -0
  85. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/outputs/analysis.md +94 -0
  86. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/timing.json +5 -0
  87. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/eval_metadata.json +12 -0
  88. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/grading.json +10 -0
  89. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/outputs/analysis.md +209 -0
  90. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/timing.json +5 -0
  91. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/grading.json +10 -0
  92. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/outputs/analysis.md +193 -0
  93. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/timing.json +5 -0
  94. package/skills/tfx-workspace/iteration-2/benchmark.json +62 -0
  95. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/eval_metadata.json +13 -0
  96. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/grading.json +11 -0
  97. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/outputs/analysis.md +382 -0
  98. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/timing.json +5 -0
  99. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/grading.json +11 -0
  100. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/outputs/analysis.md +333 -0
  101. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/timing.json +5 -0
  102. package/skills/tfx-workspace/iteration-2/review.html +1325 -0
  103. package/skills/tfx-workspace/skill-snapshot/tfx-auto/SKILL.md +217 -0
  104. package/skills/tfx-workspace/skill-snapshot/tfx-auto-codex/SKILL.md +77 -0
  105. package/skills/tfx-workspace/skill-snapshot/tfx-codex/SKILL.md +65 -0
  106. package/skills/tfx-workspace/skill-snapshot/tfx-doctor/SKILL.md +94 -0
  107. package/skills/tfx-workspace/skill-snapshot/tfx-gemini/SKILL.md +82 -0
  108. package/skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md +133 -0
  109. package/skills/tfx-workspace/skill-snapshot/tfx-multi/SKILL.md +426 -0
  110. package/skills/tfx-workspace/skill-snapshot/tfx-setup/SKILL.md +101 -0
  111. package/.claude-plugin/marketplace.json +0 -34
  112. package/.claude-plugin/plugin.json +0 -22
  113. package/config/mcp-registry.json +0 -29
  114. package/tui/codex-profile.mjs +0 -402
  115. package/tui/core.mjs +0 -236
  116. package/tui/doctor.mjs +0 -328
  117. package/tui/gemini-profile.mjs +0 -254
  118. package/tui/monitor-data.mjs +0 -148
  119. package/tui/monitor.mjs +0 -295
  120. package/tui/setup.mjs +0 -442
@@ -1,120 +1,120 @@
1
- #!/usr/bin/env node
2
- // SessionStart 훅에서 호출되는 Hub 보장 스크립트.
3
- // - /status 기반 헬스체크
4
- // - 비정상 시 Hub를 detached로 기동
5
-
6
- import { existsSync, readFileSync } from "fs";
7
- import { join, dirname } from "path";
8
- import { homedir } from "os";
9
- import { spawn } from "child_process";
10
- import { fileURLToPath } from "url";
11
-
12
- const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1"]);
13
- const PLUGIN_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
14
- const HUB_PID_FILE = join(homedir(), ".claude", "cache", "tfx-hub", "hub.pid");
15
-
16
- function formatHostForUrl(host) {
17
- return host.includes(":") ? `[${host}]` : host;
18
- }
19
-
20
- function buildHubBaseUrl(host, port) {
21
- return `http://${formatHostForUrl(host)}:${port}`;
22
- }
23
-
24
- function resolveHubTarget() {
25
- const envPortRaw = Number(process.env.TFX_HUB_PORT || "");
26
- const envPort = Number.isFinite(envPortRaw) && envPortRaw > 0 ? envPortRaw : null;
27
- const target = {
28
- host: "127.0.0.1",
29
- port: envPort || 27888,
30
- };
31
-
32
- if (existsSync(HUB_PID_FILE)) {
33
- try {
34
- const info = JSON.parse(readFileSync(HUB_PID_FILE, "utf8"));
35
- if (!envPort) {
36
- const pidPort = Number(info?.port);
37
- if (Number.isFinite(pidPort) && pidPort > 0) target.port = pidPort;
38
- }
39
- if (typeof info?.host === "string") {
40
- const host = info.host.trim();
41
- if (LOOPBACK_HOSTS.has(host)) target.host = host;
42
- }
43
- } catch {
44
- // ignore parse errors and use env/default
45
- }
46
- }
47
-
48
- return target;
49
- }
50
-
51
- async function isHubHealthy(host, port) {
52
- try {
53
- const res = await fetch(`${buildHubBaseUrl(host, port)}/status`, {
54
- signal: AbortSignal.timeout(1000),
55
- });
56
- if (!res.ok) return false;
57
- const data = await res.json();
58
- return data?.hub?.state === "healthy";
59
- } catch {
60
- return false;
61
- }
62
- }
63
-
64
- function startHubDetached(port) {
65
- const serverPath = join(PLUGIN_ROOT, "hub", "server.mjs");
66
- if (!existsSync(serverPath)) return false;
67
-
68
- try {
69
- const env = { ...process.env, TFX_HUB_PORT: String(port) };
70
- if (process.platform === "win32") {
71
- // Windows: cmd.exe /c start /b → 완전 독립 프로세스 트리 생성
72
- // hook timeout 시 프로세스 트리 킬에서 살아남음
73
- const child = spawn("cmd.exe", ["/c", "start", "/b", "", process.execPath, serverPath], {
74
- env,
75
- stdio: "ignore",
76
- windowsHide: true,
77
- });
78
- child.unref();
79
- } else {
80
- const child = spawn(process.execPath, [serverPath], {
81
- env,
82
- detached: true,
83
- stdio: "ignore",
84
- });
85
- child.unref();
86
- }
87
- return true;
88
- } catch {
89
- return false;
90
- }
91
- }
92
-
93
- /** Hub 기동 후 ready 상태까지 대기 (최대 maxWaitMs) */
94
- async function waitForHubReady(host, port, maxWaitMs = 5000) {
95
- const interval = 250;
96
- const deadline = Date.now() + maxWaitMs;
97
- while (Date.now() < deadline) {
98
- if (await isHubHealthy(host, port)) return true;
99
- await new Promise((r) => setTimeout(r, interval));
100
- }
101
- return false;
102
- }
103
-
104
- const { host, port } = resolveHubTarget();
105
- if (!(await isHubHealthy(host, port))) {
106
- const started = startHubDetached(port);
107
- if (started) {
108
- const ready = await waitForHubReady(host, port, 3000);
109
- if (ready) {
110
- process.stdout.write("hub: ok");
111
- } else {
112
- // fire-and-forget: hub이 아직 기동 중일 수 있음 — 에러가 아닌 경고
113
- process.stdout.write("hub: starting");
114
- }
115
- } else {
116
- process.stderr.write("[hub-ensure] hub 시작 실패");
117
- }
118
- } else {
119
- process.stdout.write("hub: ok");
120
- }
1
+ #!/usr/bin/env node
2
+ // SessionStart 훅에서 호출되는 Hub 보장 스크립트.
3
+ // - /status 기반 헬스체크
4
+ // - 비정상 시 Hub를 detached로 기동
5
+
6
+ import { existsSync, readFileSync } from "fs";
7
+ import { join, dirname } from "path";
8
+ import { homedir } from "os";
9
+ import { spawn } from "child_process";
10
+ import { fileURLToPath } from "url";
11
+
12
+ const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1"]);
13
+ const PLUGIN_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
14
+ const HUB_PID_FILE = join(homedir(), ".claude", "cache", "tfx-hub", "hub.pid");
15
+
16
+ function formatHostForUrl(host) {
17
+ return host.includes(":") ? `[${host}]` : host;
18
+ }
19
+
20
+ function buildHubBaseUrl(host, port) {
21
+ return `http://${formatHostForUrl(host)}:${port}`;
22
+ }
23
+
24
+ function resolveHubTarget() {
25
+ const envPortRaw = Number(process.env.TFX_HUB_PORT || "");
26
+ const envPort = Number.isFinite(envPortRaw) && envPortRaw > 0 ? envPortRaw : null;
27
+ const target = {
28
+ host: "127.0.0.1",
29
+ port: envPort || 27888,
30
+ };
31
+
32
+ if (existsSync(HUB_PID_FILE)) {
33
+ try {
34
+ const info = JSON.parse(readFileSync(HUB_PID_FILE, "utf8"));
35
+ if (!envPort) {
36
+ const pidPort = Number(info?.port);
37
+ if (Number.isFinite(pidPort) && pidPort > 0) target.port = pidPort;
38
+ }
39
+ if (typeof info?.host === "string") {
40
+ const host = info.host.trim();
41
+ if (LOOPBACK_HOSTS.has(host)) target.host = host;
42
+ }
43
+ } catch {
44
+ // ignore parse errors and use env/default
45
+ }
46
+ }
47
+
48
+ return target;
49
+ }
50
+
51
+ async function isHubHealthy(host, port) {
52
+ try {
53
+ const res = await fetch(`${buildHubBaseUrl(host, port)}/status`, {
54
+ signal: AbortSignal.timeout(1000),
55
+ });
56
+ if (!res.ok) return false;
57
+ const data = await res.json();
58
+ return data?.hub?.state === "healthy";
59
+ } catch {
60
+ return false;
61
+ }
62
+ }
63
+
64
+ function startHubDetached(port) {
65
+ const serverPath = join(PLUGIN_ROOT, "hub", "server.mjs");
66
+ if (!existsSync(serverPath)) return false;
67
+
68
+ try {
69
+ const env = { ...process.env, TFX_HUB_PORT: String(port) };
70
+ if (process.platform === "win32") {
71
+ // Windows: cmd.exe /c start /b → 완전 독립 프로세스 트리 생성
72
+ // hook timeout 시 프로세스 트리 킬에서 살아남음
73
+ const child = spawn("cmd.exe", ["/c", "start", "/b", "", process.execPath, serverPath], {
74
+ env,
75
+ stdio: "ignore",
76
+ windowsHide: true,
77
+ });
78
+ child.unref();
79
+ } else {
80
+ const child = spawn(process.execPath, [serverPath], {
81
+ env,
82
+ detached: true,
83
+ stdio: "ignore",
84
+ });
85
+ child.unref();
86
+ }
87
+ return true;
88
+ } catch {
89
+ return false;
90
+ }
91
+ }
92
+
93
+ /** Hub 기동 후 ready 상태까지 대기 (최대 maxWaitMs) */
94
+ async function waitForHubReady(host, port, maxWaitMs = 5000) {
95
+ const interval = 250;
96
+ const deadline = Date.now() + maxWaitMs;
97
+ while (Date.now() < deadline) {
98
+ if (await isHubHealthy(host, port)) return true;
99
+ await new Promise((r) => setTimeout(r, interval));
100
+ }
101
+ return false;
102
+ }
103
+
104
+ const { host, port } = resolveHubTarget();
105
+ if (!(await isHubHealthy(host, port))) {
106
+ const started = startHubDetached(port);
107
+ if (started) {
108
+ const ready = await waitForHubReady(host, port, 3000);
109
+ if (ready) {
110
+ process.stdout.write("hub: ok");
111
+ } else {
112
+ // fire-and-forget: hub이 아직 기동 중일 수 있음 — 에러가 아닌 경고
113
+ process.stdout.write("hub: starting");
114
+ }
115
+ } else {
116
+ process.stderr.write("[hub-ensure] hub 시작 실패");
117
+ }
118
+ } else {
119
+ process.stdout.write("hub: ok");
120
+ }