triflux 7.1.4 → 7.2.1

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 (73) hide show
  1. package/.claude-plugin/marketplace.json +31 -31
  2. package/.claude-plugin/plugin.json +22 -23
  3. package/bin/triflux.mjs +18 -5
  4. package/hooks/keyword-rules.json +393 -361
  5. package/hub/bridge.mjs +799 -786
  6. package/hub/delegator/contracts.mjs +37 -38
  7. package/hub/delegator/schema/delegator-tools.schema.json +250 -250
  8. package/hub/delegator/service.mjs +307 -302
  9. package/hub/intent.mjs +108 -11
  10. package/hub/lib/process-utils.mjs +20 -0
  11. package/hub/pipe.mjs +589 -589
  12. package/hub/pipeline/gates/confidence.mjs +1 -1
  13. package/hub/pipeline/gates/selfcheck.mjs +2 -4
  14. package/hub/pipeline/state.mjs +191 -187
  15. package/hub/pipeline/transitions.mjs +124 -120
  16. package/hub/public/dashboard.html +355 -349
  17. package/hub/quality/deslop.mjs +5 -3
  18. package/hub/reflexion.mjs +5 -1
  19. package/hub/research.mjs +6 -1
  20. package/hub/router.mjs +791 -782
  21. package/hub/server.mjs +893 -822
  22. package/hub/store.mjs +807 -778
  23. package/hub/team/agent-map.json +10 -0
  24. package/hub/team/ansi.mjs +3 -4
  25. package/hub/team/cli/commands/control.mjs +43 -43
  26. package/hub/team/cli/commands/interrupt.mjs +36 -36
  27. package/hub/team/cli/commands/kill.mjs +3 -3
  28. package/hub/team/cli/commands/send.mjs +37 -37
  29. package/hub/team/cli/commands/start/index.mjs +18 -8
  30. package/hub/team/cli/commands/start/parse-args.mjs +3 -1
  31. package/hub/team/cli/commands/start/start-headless.mjs +4 -1
  32. package/hub/team/cli/commands/status.mjs +87 -87
  33. package/hub/team/cli/commands/stop.mjs +1 -1
  34. package/hub/team/cli/commands/task.mjs +1 -1
  35. package/hub/team/cli/index.mjs +41 -39
  36. package/hub/team/cli/manifest.mjs +29 -28
  37. package/hub/team/cli/services/hub-client.mjs +37 -0
  38. package/hub/team/cli/services/state-store.mjs +26 -12
  39. package/hub/team/dashboard.mjs +11 -4
  40. package/hub/team/handoff.mjs +12 -0
  41. package/hub/team/headless.mjs +202 -200
  42. package/hub/team/native-supervisor.mjs +386 -346
  43. package/hub/team/nativeProxy.mjs +680 -692
  44. package/hub/team/staleState.mjs +361 -369
  45. package/hub/team/tui-viewer.mjs +27 -3
  46. package/hub/team/tui.mjs +1 -0
  47. package/hub/token-mode.mjs +114 -24
  48. package/hub/workers/delegator-mcp.mjs +1059 -1057
  49. package/hud/colors.mjs +88 -0
  50. package/hud/constants.mjs +78 -0
  51. package/hud/hud-qos-status.mjs +206 -1872
  52. package/hud/providers/claude.mjs +309 -0
  53. package/hud/providers/codex.mjs +151 -0
  54. package/hud/providers/gemini.mjs +320 -0
  55. package/hud/renderers.mjs +424 -0
  56. package/hud/terminal.mjs +140 -0
  57. package/hud/utils.mjs +271 -0
  58. package/package.json +1 -2
  59. package/scripts/__tests__/keyword-detector.test.mjs +234 -234
  60. package/scripts/headless-guard-fast.sh +21 -0
  61. package/scripts/headless-guard.mjs +26 -6
  62. package/scripts/lib/keyword-rules.mjs +166 -168
  63. package/scripts/setup.mjs +720 -690
  64. package/scripts/tfx-route-post.mjs +424 -424
  65. package/scripts/tfx-route.sh +1663 -1650
  66. package/scripts/tmp-cleanup.mjs +74 -0
  67. package/skills/tfx-auto/SKILL.md +279 -278
  68. package/skills/tfx-auto-codex/SKILL.md +98 -77
  69. package/skills/tfx-codex/SKILL.md +65 -65
  70. package/skills/tfx-gemini/SKILL.md +83 -82
  71. package/skills/tfx-hub/SKILL.md +205 -136
  72. package/skills/tfx-multi/SKILL.md +11 -5
  73. package/.mcp.json +0 -8
@@ -1,31 +1,31 @@
1
- {
2
- "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
- "name": "triflux",
4
- "description": "CLI-first multi-model orchestrator — Codex/Gemini/Claude routing with DAG execution, auto-triage, and cost optimization",
5
- "owner": {
6
- "name": "tellang"
7
- },
8
- "plugins": [
9
- {
10
- "name": "triflux",
11
- "description": "CLI-first multi-model orchestrator for Claude Code. Routes tasks to Codex, Gemini, and Claude CLIs with automatic triage (Sonnet classification + Opus decomposition), DAG-based parallel execution, and cost-optimized routing. Includes 16 skills, HUD status bar, and shell-based CLI routing wrapper.",
12
- "version": "1.0.0",
13
- "author": {
14
- "name": "tellang"
15
- },
16
- "source": "./",
17
- "category": "productivity",
18
- "homepage": "https://github.com/tellang/triflux",
19
- "tags": [
20
- "multi-model",
21
- "codex",
22
- "gemini",
23
- "cli-routing",
24
- "orchestration",
25
- "cost-optimization",
26
- "dag-execution"
27
- ]
28
- }
29
- ],
30
- "version": "1.0.0"
31
- }
1
+ {
2
+ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
3
+ "name": "triflux",
4
+ "description": "CLI-first multi-model orchestrator — Codex/Gemini/Claude routing with DAG execution, auto-triage, and cost optimization",
5
+ "owner": {
6
+ "name": "tellang"
7
+ },
8
+ "plugins": [
9
+ {
10
+ "name": "triflux",
11
+ "description": "CLI-first multi-model orchestrator for Claude Code. Routes tasks to Codex, Gemini, and Claude CLIs with automatic triage (Sonnet classification + Opus decomposition), DAG-based parallel execution, and cost-optimized routing. Includes 16 skills, HUD status bar, and shell-based CLI routing wrapper.",
12
+ "version": "7.1.4",
13
+ "author": {
14
+ "name": "tellang"
15
+ },
16
+ "source": "./",
17
+ "category": "productivity",
18
+ "homepage": "https://github.com/tellang/triflux",
19
+ "tags": [
20
+ "multi-model",
21
+ "codex",
22
+ "gemini",
23
+ "cli-routing",
24
+ "orchestration",
25
+ "cost-optimization",
26
+ "dag-execution"
27
+ ]
28
+ }
29
+ ],
30
+ "version": "7.1.4"
31
+ }
@@ -1,23 +1,22 @@
1
- {
2
- "name": "triflux",
3
- "version": "1.0.0",
4
- "description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Gemini, and Claude",
5
- "author": {
6
- "name": "tellang"
7
- },
8
- "repository": "https://github.com/tellang/triflux",
9
- "homepage": "https://github.com/tellang/triflux",
10
- "license": "MIT",
11
- "keywords": [
12
- "claude-code",
13
- "plugin",
14
- "codex",
15
- "gemini",
16
- "cli-routing",
17
- "orchestration",
18
- "multi-model"
19
- ],
20
- "skills": "./skills/",
21
- "hooks": "./hooks/hooks.json",
22
- "mcpServers": "./.mcp.json"
23
- }
1
+ {
2
+ "name": "triflux",
3
+ "version": "7.2.1",
4
+ "description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Gemini, and Claude",
5
+ "author": {
6
+ "name": "tellang"
7
+ },
8
+ "repository": "https://github.com/tellang/triflux",
9
+ "homepage": "https://github.com/tellang/triflux",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "claude-code",
13
+ "plugin",
14
+ "codex",
15
+ "gemini",
16
+ "cli-routing",
17
+ "orchestration",
18
+ "multi-model"
19
+ ],
20
+ "skills": "./skills/",
21
+ "hooks": "./hooks/hooks.json"
22
+ }
package/bin/triflux.mjs CHANGED
@@ -139,6 +139,7 @@ const CLI_COMMAND_SCHEMAS = Object.freeze({
139
139
  });
140
140
 
141
141
  // ── 유틸리티 ──
142
+ // ok/warn/fail/info/section 의 console.log는 디버그 로그가 아닌 의도된 CLI 출력입니다.
142
143
 
143
144
  function ok(msg) { console.log(` ${GREEN_BRIGHT}✓${RESET} ${msg}`); }
144
145
  function warn(msg) { console.log(` ${YELLOW}⚠${RESET} ${msg}`); }
@@ -1039,7 +1040,7 @@ async function cmdDoctor(options = {}) {
1039
1040
  ok("설치됨");
1040
1041
  } else {
1041
1042
  addDoctorCheck(report, { name: "hud-qos-status.mjs", status: "missing", path: hud, optional: true, fix: "tfx setup" });
1042
- warn("미설치 ${GRAY}(선택사항)${RESET}");
1043
+ warn(`미설치 ${GRAY}(선택사항)${RESET}`);
1043
1044
  }
1044
1045
 
1045
1046
  // 3. Codex CLI
@@ -1207,6 +1208,17 @@ async function cmdDoctor(options = {}) {
1207
1208
  if (e.ts > groups[key].ts) { groups[key].ts = e.ts; groups[key].snippet = e.snippet; }
1208
1209
  }
1209
1210
 
1211
+ // semver 비교 (lexicographic 비교 버그 방지)
1212
+ function semverGte(a, b) {
1213
+ const pa = a.split('.').map(Number);
1214
+ const pb = b.split('.').map(Number);
1215
+ for (let i = 0; i < 3; i++) {
1216
+ if ((pa[i] || 0) > (pb[i] || 0)) return true;
1217
+ if ((pa[i] || 0) < (pb[i] || 0)) return false;
1218
+ }
1219
+ return true;
1220
+ }
1221
+
1210
1222
  // 알려진 해결 버전 (패턴별 수정된 triflux 버전)
1211
1223
  const KNOWN_FIXES = {
1212
1224
  "gemini:deprecated_flag": "1.8.9", // -p → --prompt
@@ -1217,7 +1229,7 @@ async function cmdDoctor(options = {}) {
1217
1229
 
1218
1230
  for (const [key, g] of Object.entries(groups)) {
1219
1231
  const fixVer = KNOWN_FIXES[key];
1220
- if (fixVer && currentVer >= fixVer) {
1232
+ if (fixVer && semverGte(currentVer, fixVer)) {
1221
1233
  // 해결된 이슈 — 자동 정리
1222
1234
  cleaned += g.count;
1223
1235
  continue;
@@ -1238,7 +1250,7 @@ async function cmdDoctor(options = {}) {
1238
1250
  const remaining = entries.filter(e => {
1239
1251
  const key = `${e.cli}:${e.pattern}`;
1240
1252
  const fixVer = KNOWN_FIXES[key];
1241
- return !(fixVer && currentVer >= fixVer);
1253
+ return !(fixVer && semverGte(currentVer, fixVer));
1242
1254
  });
1243
1255
  writeFileSync(issuesFile, remaining.map(e => JSON.stringify(e)).join("\n") + (remaining.length ? "\n" : ""));
1244
1256
  ok(`${cleaned}개 해결된 이슈 자동 정리됨`);
@@ -1421,10 +1433,11 @@ async function cmdDoctor(options = {}) {
1421
1433
  if (!hasActiveMember && teamConfig.leadSessionId) {
1422
1434
  try {
1423
1435
  const sessionToken = teamConfig.leadSessionId.toLowerCase();
1436
+ const safeToken = teamConfig.leadSessionId.slice(0, 8).replace(/[^a-zA-Z0-9\-]/g, '');
1424
1437
  // Claude Code 프로세스에서 세션 ID 검색
1425
1438
  if (process.platform === "win32") {
1426
1439
  const psOut = execSync(
1427
- `powershell -NoProfile -Command "$ErrorActionPreference='SilentlyContinue'; Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match '${teamConfig.leadSessionId.slice(0, 8)}' } | Select-Object ProcessId | ConvertTo-Json -Compress"`,
1440
+ `powershell -NoProfile -Command "$ErrorActionPreference='SilentlyContinue'; Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match '${safeToken}' } | Select-Object ProcessId | ConvertTo-Json -Compress"`,
1428
1441
  { encoding: "utf8", timeout: 8000, stdio: ["ignore", "pipe", "ignore"], windowsHide: true },
1429
1442
  ).trim();
1430
1443
  if (psOut && psOut !== "null") {
@@ -1434,7 +1447,7 @@ async function cmdDoctor(options = {}) {
1434
1447
  }
1435
1448
  } else {
1436
1449
  const psOut = execSync(
1437
- `ps -ax -o pid=,command= | grep -i '${teamConfig.leadSessionId.slice(0, 8)}' | grep -v grep`,
1450
+ `ps -ax -o pid=,command= | grep -i '${safeToken}' | grep -v grep`,
1438
1451
  { encoding: "utf8", timeout: 5000, stdio: ["ignore", "pipe", "ignore"] },
1439
1452
  ).trim();
1440
1453
  hasActiveMember = psOut.length > 0;