triflux 10.0.0 → 10.0.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.
- package/CLAUDE.md +171 -0
- package/README.md +32 -15
- package/bin/triflux.mjs +62 -5
- package/hooks/agent-route-guard.mjs +109 -0
- package/hooks/cross-review-tracker.mjs +122 -0
- package/hooks/error-context.mjs +148 -0
- package/hooks/hook-adaptive-collector.mjs +86 -0
- package/hooks/hook-manager.mjs +365 -0
- package/hooks/hook-orchestrator.mjs +312 -0
- package/hooks/hook-registry.json +246 -0
- package/hooks/hooks.json +89 -0
- package/hooks/keyword-rules.json +574 -0
- package/hooks/lib/resolve-root.mjs +59 -0
- package/hooks/mcp-config-watcher.mjs +80 -0
- package/hooks/pipeline-stop.mjs +76 -0
- package/hooks/safety-guard.mjs +169 -0
- package/hooks/subagent-verifier.mjs +80 -0
- package/hub/account-broker.mjs +251 -0
- package/hub/adaptive-diagnostic.mjs +323 -0
- package/hub/adaptive-inject.mjs +186 -0
- package/hub/adaptive-memory.mjs +163 -0
- package/hub/adaptive.mjs +143 -0
- package/hub/assign-callbacks.mjs +133 -0
- package/hub/bridge.mjs +799 -0
- package/hub/cli-adapter-base.mjs +280 -0
- package/hub/codex-adapter.mjs +199 -0
- package/hub/codex-compat.mjs +11 -0
- package/hub/codex-preflight.mjs +166 -0
- package/hub/delegator/contracts.mjs +37 -0
- package/hub/delegator/index.mjs +14 -0
- package/hub/delegator/schema/delegator-tools.schema.json +250 -0
- package/hub/delegator/service.mjs +307 -0
- package/hub/delegator/tool-definitions.mjs +35 -0
- package/hub/fullcycle.mjs +96 -0
- package/hub/gemini-adapter.mjs +180 -0
- package/hub/hitl.mjs +143 -0
- package/hub/intent.mjs +193 -0
- package/hub/lib/cache-guard.mjs +114 -0
- package/hub/lib/known-errors.json +72 -0
- package/hub/lib/memory-store.mjs +748 -0
- package/hub/lib/process-utils.mjs +361 -0
- package/hub/lib/ssh-command.mjs +211 -0
- package/hub/lib/ssh-retry.mjs +59 -0
- package/hub/lib/uuidv7.mjs +44 -0
- package/hub/memory-doctor.mjs +480 -0
- package/hub/middleware/request-logger.mjs +161 -0
- package/hub/paths.mjs +30 -0
- package/hub/pipe.mjs +664 -0
- package/hub/pipeline/gates/confidence.mjs +56 -0
- package/hub/pipeline/gates/consensus.mjs +94 -0
- package/hub/pipeline/gates/index.mjs +5 -0
- package/hub/pipeline/gates/selfcheck.mjs +82 -0
- package/hub/pipeline/index.mjs +318 -0
- package/hub/pipeline/state.mjs +191 -0
- package/hub/pipeline/transitions.mjs +124 -0
- package/hub/platform.mjs +225 -0
- package/hub/public/dashboard.html +355 -0
- package/hub/public/tray-icon.ico +0 -0
- package/hub/public/tray-icon.png +0 -0
- package/hub/quality/deslop.mjs +253 -0
- package/hub/reflexion.mjs +372 -0
- package/hub/research.mjs +146 -0
- package/hub/router.mjs +791 -0
- package/hub/routing/complexity.mjs +166 -0
- package/hub/routing/index.mjs +117 -0
- package/hub/routing/q-learning.mjs +336 -0
- package/hub/schema.sql +148 -0
- package/hub/server.mjs +1264 -0
- package/hub/session-fingerprint.mjs +352 -0
- package/hub/state.mjs +258 -0
- package/hub/store-adapter.mjs +118 -0
- package/hub/store.mjs +857 -0
- package/hub/team/agent-map.json +11 -0
- package/hub/team/ansi.mjs +379 -0
- package/hub/team/backend.mjs +90 -0
- package/hub/team/cli/commands/attach.mjs +37 -0
- package/hub/team/cli/commands/control.mjs +43 -0
- package/hub/team/cli/commands/debug.mjs +74 -0
- package/hub/team/cli/commands/focus.mjs +53 -0
- package/hub/team/cli/commands/interrupt.mjs +36 -0
- package/hub/team/cli/commands/kill.mjs +37 -0
- package/hub/team/cli/commands/list.mjs +24 -0
- package/hub/team/cli/commands/send.mjs +37 -0
- package/hub/team/cli/commands/start/index.mjs +106 -0
- package/hub/team/cli/commands/start/parse-args.mjs +130 -0
- package/hub/team/cli/commands/start/start-headless.mjs +109 -0
- package/hub/team/cli/commands/start/start-in-process.mjs +40 -0
- package/hub/team/cli/commands/start/start-mux.mjs +73 -0
- package/hub/team/cli/commands/start/start-wt.mjs +69 -0
- package/hub/team/cli/commands/status.mjs +87 -0
- package/hub/team/cli/commands/stop.mjs +31 -0
- package/hub/team/cli/commands/task.mjs +30 -0
- package/hub/team/cli/commands/tasks.mjs +13 -0
- package/hub/team/cli/help.mjs +42 -0
- package/hub/team/cli/index.mjs +41 -0
- package/hub/team/cli/manifest.mjs +29 -0
- package/hub/team/cli/render.mjs +30 -0
- package/hub/team/cli/services/attach-fallback.mjs +54 -0
- package/hub/team/cli/services/hub-client.mjs +227 -0
- package/hub/team/cli/services/member-selector.mjs +30 -0
- package/hub/team/cli/services/native-control.mjs +117 -0
- package/hub/team/cli/services/runtime-mode.mjs +62 -0
- package/hub/team/cli/services/state-store.mjs +48 -0
- package/hub/team/cli/services/task-model.mjs +30 -0
- package/hub/team/conductor-mesh-bridge.mjs +121 -0
- package/hub/team/conductor.mjs +671 -0
- package/hub/team/dashboard-anchor.mjs +14 -0
- package/hub/team/dashboard-layout.mjs +33 -0
- package/hub/team/dashboard-open.mjs +153 -0
- package/hub/team/dashboard.mjs +274 -0
- package/hub/team/event-log.mjs +76 -0
- package/hub/team/handoff.mjs +303 -0
- package/hub/team/headless.mjs +1156 -0
- package/hub/team/health-probe.mjs +272 -0
- package/hub/team/launcher-template.mjs +95 -0
- package/hub/team/lead-control.mjs +104 -0
- package/hub/team/native-supervisor.mjs +392 -0
- package/hub/team/native.mjs +649 -0
- package/hub/team/nativeProxy.mjs +688 -0
- package/hub/team/notify.mjs +293 -0
- package/hub/team/orchestrator.mjs +161 -0
- package/hub/team/pane.mjs +153 -0
- package/hub/team/process-cleanup.mjs +342 -0
- package/hub/team/psmux.mjs +1354 -0
- package/hub/team/remote-probe.mjs +276 -0
- package/hub/team/remote-session.mjs +299 -0
- package/hub/team/remote-watcher.mjs +478 -0
- package/hub/team/routing.mjs +223 -0
- package/hub/team/session-sync.mjs +169 -0
- package/hub/team/session.mjs +611 -0
- package/hub/team/shared.mjs +13 -0
- package/hub/team/staleState.mjs +361 -0
- package/hub/team/swarm-hypervisor.mjs +589 -0
- package/hub/team/swarm-locks.mjs +204 -0
- package/hub/team/swarm-planner.mjs +260 -0
- package/hub/team/swarm-reconciler.mjs +137 -0
- package/hub/team/tui-lite.mjs +380 -0
- package/hub/team/tui-remote-adapter.mjs +393 -0
- package/hub/team/tui-viewer.mjs +463 -0
- package/hub/team/tui.mjs +1449 -0
- package/hub/team/worktree-lifecycle.mjs +193 -0
- package/hub/team/wt-manager.mjs +407 -0
- package/hub/team/wt-templates.json +43 -0
- package/hub/team-bridge.mjs +27 -0
- package/hub/token-mode.mjs +224 -0
- package/hub/tools.mjs +636 -0
- package/hub/tray.mjs +376 -0
- package/hub/workers/claude-worker.mjs +475 -0
- package/hub/workers/codex-mcp.mjs +507 -0
- package/hub/workers/delegator-mcp.mjs +1076 -0
- package/hub/workers/factory.mjs +21 -0
- package/hub/workers/gemini-worker.mjs +374 -0
- package/hub/workers/interface.mjs +52 -0
- package/hub/workers/worker-utils.mjs +104 -0
- package/hud/colors.mjs +88 -0
- package/hud/constants.mjs +88 -0
- package/hud/context-monitor.mjs +403 -0
- package/hud/hud-qos-status.mjs +210 -0
- package/hud/providers/claude.mjs +314 -0
- package/hud/providers/codex.mjs +151 -0
- package/hud/providers/gemini.mjs +320 -0
- package/hud/renderers.mjs +442 -0
- package/hud/terminal.mjs +140 -0
- package/hud/utils.mjs +313 -0
- package/mesh/index.mjs +63 -0
- package/mesh/mesh-budget.mjs +128 -0
- package/mesh/mesh-heartbeat.mjs +100 -0
- package/mesh/mesh-protocol.mjs +96 -0
- package/mesh/mesh-queue.mjs +165 -0
- package/mesh/mesh-registry.mjs +78 -0
- package/mesh/mesh-router.mjs +76 -0
- package/package.json +8 -1
- package/references/hosts.json +33 -0
- package/scripts/__tests__/gen-skill-docs.test.mjs +87 -0
- package/scripts/__tests__/keyword-detector.test.mjs +234 -0
- package/scripts/__tests__/mcp-guard-engine.test.mjs +118 -0
- package/scripts/__tests__/remote-spawn-transfer.test.mjs +117 -0
- package/scripts/__tests__/remote-spawn.test.mjs +92 -0
- package/scripts/__tests__/skill-template.test.mjs +193 -0
- package/scripts/__tests__/smoke.test.mjs +34 -0
- package/scripts/cache-buildup.mjs +30 -0
- package/scripts/cache-doctor.mjs +149 -0
- package/scripts/cache-warmup.mjs +557 -0
- package/scripts/claudemd-sync.mjs +148 -0
- package/scripts/cli-route.sh +3 -0
- package/scripts/completions/tfx.bash +47 -0
- package/scripts/completions/tfx.fish +44 -0
- package/scripts/completions/tfx.zsh +83 -0
- package/scripts/cross-review-gate.mjs +126 -0
- package/scripts/cross-review-tracker.mjs +238 -0
- package/scripts/gen-skill-docs.mjs +111 -0
- package/scripts/headless-guard-fast.sh +21 -0
- package/scripts/headless-guard.mjs +360 -0
- package/scripts/hub-ensure.mjs +120 -0
- package/scripts/keyword-detector.mjs +272 -0
- package/scripts/keyword-rules-expander.mjs +521 -0
- package/scripts/lib/claudemd-scanner.mjs +218 -0
- package/scripts/lib/context.mjs +67 -0
- package/scripts/lib/cross-review-utils.mjs +51 -0
- package/scripts/lib/env-probe.mjs +241 -0
- package/scripts/lib/gemini-profiles.mjs +85 -0
- package/scripts/lib/handoff.mjs +171 -0
- package/scripts/lib/hook-utils.mjs +14 -0
- package/scripts/lib/keyword-rules.mjs +166 -0
- package/scripts/lib/logger.mjs +105 -0
- package/scripts/lib/mcp-filter.mjs +739 -0
- package/scripts/lib/mcp-guard-engine.mjs +954 -0
- package/scripts/lib/mcp-manifest.mjs +79 -0
- package/scripts/lib/mcp-server-catalog.mjs +118 -0
- package/scripts/lib/psmux-info.mjs +119 -0
- package/scripts/lib/remote-spawn-transfer.mjs +196 -0
- package/scripts/lib/skill-template.mjs +326 -0
- package/scripts/mcp-check.mjs +237 -0
- package/scripts/mcp-cleanup.ps1 +17 -0
- package/scripts/mcp-gateway-config.mjs +207 -0
- package/scripts/mcp-gateway-ensure.mjs +85 -0
- package/scripts/mcp-gateway-integration-test.mjs +228 -0
- package/scripts/mcp-gateway-start.mjs +226 -0
- package/scripts/mcp-gateway-start.ps1 +141 -0
- package/scripts/mcp-gateway-verify.mjs +77 -0
- package/scripts/mcp-safety-guard.mjs +44 -0
- package/scripts/notion-read.mjs +556 -0
- package/scripts/pack.mjs +295 -0
- package/scripts/preflight-cache.mjs +69 -0
- package/scripts/preinstall.mjs +96 -0
- package/scripts/remote-spawn.mjs +1376 -0
- package/scripts/run.cjs +79 -0
- package/scripts/session-spawn-helper.mjs +185 -0
- package/scripts/setup.mjs +1176 -0
- package/scripts/test-lock.mjs +71 -0
- package/scripts/test-tfx-route-no-claude-native.mjs +57 -0
- package/scripts/tfx-batch-stats.mjs +96 -0
- package/scripts/tfx-gate-activate.mjs +89 -0
- package/scripts/tfx-route-post.mjs +505 -0
- package/scripts/tfx-route-worker.mjs +223 -0
- package/scripts/tfx-route.sh +2014 -0
- package/scripts/tmp-cleanup.mjs +103 -0
- package/scripts/token-snapshot.mjs +575 -0
- package/skills/tfx-auto/SKILL.md.tmpl +2 -3
- package/skills/tfx-autoresearch/SKILL.md +6 -5
- package/skills/tfx-codex/SKILL.md.tmpl +2 -3
- package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +33 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/eval_metadata.json +42 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +11 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/analysis.md +87 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/classification.md +35 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/commands.sh +275 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/routing.md +56 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/timing.json +5 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +11 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/analysis.md +92 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/classification.md +71 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/commands.sh +264 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/routing.md +113 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/timing.json +5 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/eval_metadata.json +32 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +9 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/analysis.md +96 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/classification.md +38 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/commands.sh +151 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/routing.md +51 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/timing.json +5 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +9 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/analysis.md +127 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/classification.md +57 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/commands.sh +129 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/routing.md +84 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/timing.json +5 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/eval_metadata.json +27 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +8 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/analysis.md +98 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/classification.md +65 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/commands.sh +123 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/routing.md +66 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/timing.json +5 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +8 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/analysis.md +88 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/classification.md +40 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/commands.sh +130 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/routing.md +61 -0
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/timing.json +5 -0
- package/skills/tfx-deep-interview/SKILL.md +1 -2
- package/skills/tfx-plan/SKILL.md.tmpl +2 -3
- package/skills/tfx-psmux-rules/SKILL.md +11 -2
- package/skills/tfx-qa/SKILL.md.tmpl +2 -3
- package/skills/tfx-remote-spawn/SKILL.md +8 -11
- package/skills/tfx-research/SKILL.md.tmpl +2 -3
- package/skills/tfx-review/SKILL.md.tmpl +2 -3
- package/skills/tfx-workspace/async-tests/run-tests.sh +203 -0
- package/skills/tfx-workspace/evals/evals.json +79 -0
- package/skills/tfx-workspace/iteration-1/benchmark.json +162 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/eval_metadata.json +11 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/grading.json +9 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/outputs/analysis.md +154 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/grading.json +9 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/outputs/analysis.md +126 -0
- package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/eval_metadata.json +11 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/grading.json +9 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/outputs/analysis.md +119 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/grading.json +9 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/outputs/analysis.md +115 -0
- package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/eval_metadata.json +10 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/grading.json +8 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/outputs/analysis.md +86 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/grading.json +8 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/outputs/analysis.md +81 -0
- package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/eval_metadata.json +12 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/grading.json +10 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/outputs/analysis.md +316 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/grading.json +10 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/outputs/analysis.md +352 -0
- package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/review.html +1325 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/eval_metadata.json +12 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/grading.json +10 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/outputs/analysis.md +97 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/grading.json +10 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/outputs/analysis.md +94 -0
- package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/eval_metadata.json +12 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/grading.json +10 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/outputs/analysis.md +209 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/grading.json +10 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/outputs/analysis.md +193 -0
- package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-2/benchmark.json +62 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/eval_metadata.json +13 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/grading.json +11 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/outputs/analysis.md +382 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/grading.json +11 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/outputs/analysis.md +333 -0
- package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/timing.json +5 -0
- package/skills/tfx-workspace/iteration-2/review.html +1325 -0
- package/skills/tfx-workspace/skill-snapshot/tfx-auto/SKILL.md +217 -0
- package/skills/{tfx-auto-codex/SKILL.md.tmpl → tfx-workspace/skill-snapshot/tfx-auto-codex/SKILL.md} +3 -31
- package/skills/tfx-workspace/skill-snapshot/tfx-codex/SKILL.md +65 -0
- package/skills/tfx-workspace/skill-snapshot/tfx-doctor/SKILL.md +94 -0
- package/skills/{tfx-gemini/SKILL.md.tmpl → tfx-workspace/skill-snapshot/tfx-gemini/SKILL.md} +6 -14
- package/skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md +133 -0
- package/skills/tfx-workspace/skill-snapshot/tfx-multi/SKILL.md +426 -0
- package/skills/tfx-workspace/skill-snapshot/tfx-setup/SKILL.md +101 -0
- package/skills/merge-worktree/SKILL.md.tmpl +0 -144
- package/skills/shared/arguments-processing.md +0 -2
- package/skills/shared/mandatory-rules.md +0 -6
- package/skills/shared/telemetry-segment.md +0 -6
- package/skills/star-prompt/SKILL.md.tmpl +0 -122
- package/skills/tfx-analysis/SKILL.md.tmpl +0 -106
- package/skills/tfx-analysis/skill.json +0 -11
- package/skills/tfx-auto/skill.json +0 -26
- package/skills/tfx-auto-codex/skill.json +0 -8
- package/skills/tfx-autopilot/SKILL.md.tmpl +0 -115
- package/skills/tfx-autopilot/skill.json +0 -10
- package/skills/tfx-autoresearch/SKILL.md.tmpl +0 -135
- package/skills/tfx-autoresearch/skill.json +0 -14
- package/skills/tfx-autoroute/SKILL.md.tmpl +0 -188
- package/skills/tfx-autoroute/skill.json +0 -12
- package/skills/tfx-codex/skill.json +0 -8
- package/skills/tfx-codex-swarm/SKILL.md.tmpl +0 -16
- package/skills/tfx-codex-swarm/skill.json +0 -5
- package/skills/tfx-consensus/SKILL.md.tmpl +0 -145
- package/skills/tfx-consensus/skill.json +0 -8
- package/skills/tfx-debate/SKILL.md.tmpl +0 -191
- package/skills/tfx-debate/skill.json +0 -12
- package/skills/tfx-deep-analysis/SKILL.md.tmpl +0 -227
- package/skills/tfx-deep-analysis/skill.json +0 -10
- package/skills/tfx-deep-interview/SKILL.md.tmpl +0 -203
- package/skills/tfx-deep-interview/skill.json +0 -12
- package/skills/tfx-deep-plan/SKILL.md.tmpl +0 -281
- package/skills/tfx-deep-plan/skill.json +0 -13
- package/skills/tfx-deep-qa/SKILL.md.tmpl +0 -164
- package/skills/tfx-deep-qa/skill.json +0 -11
- package/skills/tfx-deep-research/SKILL.md.tmpl +0 -216
- package/skills/tfx-deep-research/skill.json +0 -14
- package/skills/tfx-deep-review/SKILL.md.tmpl +0 -178
- package/skills/tfx-deep-review/skill.json +0 -12
- package/skills/tfx-doctor/SKILL.md.tmpl +0 -172
- package/skills/tfx-doctor/skill.json +0 -8
- package/skills/tfx-find/skill.json +0 -12
- package/skills/tfx-forge/SKILL.md.tmpl +0 -187
- package/skills/tfx-forge/skill.json +0 -12
- package/skills/tfx-fullcycle/SKILL.md.tmpl +0 -285
- package/skills/tfx-fullcycle/skill.json +0 -11
- package/skills/tfx-gemini/skill.json +0 -8
- package/skills/tfx-hooks/SKILL.md.tmpl +0 -216
- package/skills/tfx-hooks/skill.json +0 -8
- package/skills/tfx-hub/SKILL.md.tmpl +0 -212
- package/skills/tfx-hub/skill.json +0 -8
- package/skills/tfx-index/skill.json +0 -11
- package/skills/tfx-interview/SKILL.md.tmpl +0 -284
- package/skills/tfx-interview/skill.json +0 -12
- package/skills/tfx-multi/SKILL.md.tmpl +0 -183
- package/skills/tfx-multi/skill.json +0 -8
- package/skills/tfx-panel/SKILL.md.tmpl +0 -188
- package/skills/tfx-panel/skill.json +0 -12
- package/skills/tfx-persist/SKILL.md.tmpl +0 -269
- package/skills/tfx-persist/skill.json +0 -12
- package/skills/tfx-plan/skill.json +0 -11
- package/skills/tfx-profile/SKILL.md.tmpl +0 -239
- package/skills/tfx-profile/skill.json +0 -8
- package/skills/tfx-prune/SKILL.md.tmpl +0 -199
- package/skills/tfx-prune/skill.json +0 -12
- package/skills/tfx-psmux-rules/SKILL.md.tmpl +0 -317
- package/skills/tfx-psmux-rules/skill.json +0 -8
- package/skills/tfx-qa/skill.json +0 -11
- package/skills/tfx-ralph/SKILL.md.tmpl +0 -27
- package/skills/tfx-ralph/skill.json +0 -8
- package/skills/tfx-remote-setup/SKILL.md.tmpl +0 -576
- package/skills/tfx-remote-setup/skill.json +0 -8
- package/skills/tfx-remote-spawn/SKILL.md.tmpl +0 -263
- package/skills/tfx-remote-spawn/skill.json +0 -9
- package/skills/tfx-research/skill.json +0 -13
- package/skills/tfx-review/skill.json +0 -11
- package/skills/tfx-setup/SKILL.md.tmpl +0 -380
- package/skills/tfx-setup/skill.json +0 -8
- package/skills/tfx-swarm/SKILL.md.tmpl +0 -154
- package/skills/tfx-swarm/skill.json +0 -5
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# triflux — Claude Code 운영 가이드
|
|
2
|
+
|
|
3
|
+
<core-systems>
|
|
4
|
+
## 핵심 스킬 시스템 (항상 인지)
|
|
5
|
+
|
|
6
|
+
이 프로젝트는 3개의 스킬 시스템을 동시에 사용한다. 어떤 작업이든 해당 시스템의 스킬이 있는지 먼저 확인한다.
|
|
7
|
+
|
|
8
|
+
| 시스템 | 접두사 | 용도 | 스킬 수 |
|
|
9
|
+
|--------|--------|------|---------|
|
|
10
|
+
| **triflux** | `/tfx-*` | CLI 라우팅, 멀티모델 오케스트레이션, 스웜, 원격 실행 | ~40개 |
|
|
11
|
+
| **gstack** | `/` (접두사 없음) | QA, ship, investigate, design, review, checkpoint | ~35개 |
|
|
12
|
+
| **omc** | `/oh-my-claudecode:*` | autopilot, ralph, team, ultrawork, ccg | ~25개 |
|
|
13
|
+
|
|
14
|
+
스킬을 모르면 자연어 라우팅(아래)으로 자동 매핑된다.
|
|
15
|
+
세션 종료 전 메모리 파일이 3개+ 변경됐으면 `/memory-hygiene` 제안을 검토한다.
|
|
16
|
+
</core-systems>
|
|
17
|
+
|
|
18
|
+
<routing>
|
|
19
|
+
## 자연어 → 스킬 라우팅
|
|
20
|
+
|
|
21
|
+
사용자가 스킬명을 모르더라도 자연어로 요청하면 아래 규칙에 따라 적절한 스킬을 호출한다.
|
|
22
|
+
|
|
23
|
+
### 행동 유형 → 스킬 매핑
|
|
24
|
+
|
|
25
|
+
| 의도 | 자연어 신호 | 스킬 |
|
|
26
|
+
|------|-----------|------|
|
|
27
|
+
| 구현/수정 | 만들어, 고쳐, 구현해, 짜줘, 수정해, 바꿔 | tfx-auto |
|
|
28
|
+
| 리뷰 | 봐줘, 리뷰해, 검토해, 괜찮아? | tfx-review |
|
|
29
|
+
| 분석 | 분석해, 어떻게 돌아가?, 구조가 뭐야 | tfx-analysis |
|
|
30
|
+
| 계획 | 계획, 어떻게 하지, 설계해 | tfx-plan |
|
|
31
|
+
| 검색 | 찾아, 어디있어, 파일 찾아 | tfx-find |
|
|
32
|
+
| 리서치 (빠른) | 검색해줘, 찾아봐, 공식문서, 이거 뭐야 | tfx-research |
|
|
33
|
+
| 리서치 (자율) | 자율 리서치, 검색하고 정리해, research and plan | tfx-autoresearch |
|
|
34
|
+
| 테스트 | 테스트, 검증, 돌려봐, QA | tfx-qa |
|
|
35
|
+
| 정리 | 정리해, 슬롭 제거, 클린업 | tfx-prune |
|
|
36
|
+
| 토론 | 뭐가 나을까, 비교해, A vs B | tfx-debate |
|
|
37
|
+
|
|
38
|
+
### 깊이 수정자
|
|
39
|
+
|
|
40
|
+
| 수정자 | 신호 | 효과 |
|
|
41
|
+
|--------|------|------|
|
|
42
|
+
| 기본 | (없음), 빠르게, 간단히 | Light 스킬 |
|
|
43
|
+
| 깊이 | 제대로, 꼼꼼히, 철저히 | Deep 스킬 (tfx-deep-*). 예외: tfx-deep-interview는 Gemini 단독 |
|
|
44
|
+
| 합의 | 3자, 교차, 다각도 | consensus 프로토콜 |
|
|
45
|
+
| 반복 | 끝까지, 멈추지마, ralph | persist 모드 |
|
|
46
|
+
| 자율 | 알아서, 자동으로, autopilot | autopilot 모드 |
|
|
47
|
+
|
|
48
|
+
### CLI 라우팅
|
|
49
|
+
|
|
50
|
+
headless-guard가 `codex exec` / `gemini -y -p` 직접 호출을 차단한다. tfx 스킬 경유 필수.
|
|
51
|
+
|
|
52
|
+
**Layer 1 — Light** (tfx-route.sh → 단일 CLI)
|
|
53
|
+
|
|
54
|
+
| 스킬 | CLI | 용도 |
|
|
55
|
+
|------|-----|------|
|
|
56
|
+
| tfx-auto | 자동 | 통합 진입점 |
|
|
57
|
+
| tfx-codex | Codex | Codex 전용 |
|
|
58
|
+
| tfx-gemini | Gemini | Gemini 전용 |
|
|
59
|
+
| tfx-autopilot | Codex→검증 | 단일 파일, 5분 이내 |
|
|
60
|
+
| tfx-autoroute | 자동 승격 | 실패→더 강한 모델 |
|
|
61
|
+
|
|
62
|
+
**Layer 2 — Deep** (headless 3-CLI 합의)
|
|
63
|
+
|
|
64
|
+
tfx-deep-review, tfx-deep-qa, tfx-deep-plan, tfx-deep-research, tfx-consensus, tfx-debate, tfx-panel, tfx-fullcycle, tfx-persist
|
|
65
|
+
|
|
66
|
+
**Layer 3 — Remote/병렬**
|
|
67
|
+
|
|
68
|
+
| 스킬 | 용도 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| tfx-multi | 2+개 태스크 headless 병렬 |
|
|
71
|
+
| tfx-codex-swarm | PRD별 worktree + Codex 다중 (로컬 전용) |
|
|
72
|
+
| tfx-remote-spawn | Claude Code 원격 세션 (SSH, setup 필수) |
|
|
73
|
+
|
|
74
|
+
**Claude 네이티브** (CLI 불필요): tfx-find, tfx-forge, tfx-prune, tfx-index, tfx-setup, tfx-doctor, tfx-hooks, tfx-hub
|
|
75
|
+
|
|
76
|
+
자원 우선순위: remote-spawn > codex-swarm > multi > Light > 로컬 단독
|
|
77
|
+
|
|
78
|
+
### 충돌 해소
|
|
79
|
+
|
|
80
|
+
- ralph = persist alias
|
|
81
|
+
- "auto" 단독 → tfx-auto. "알아서 해" → tfx-autopilot
|
|
82
|
+
- "코드에서 찾아" → tfx-find. "알아봐" → tfx-research
|
|
83
|
+
- 복합 의도: "구현하고 리뷰까지" → tfx-auto → cross-review hook
|
|
84
|
+
</routing>
|
|
85
|
+
|
|
86
|
+
<session-context>
|
|
87
|
+
## 맥락 이탈 판단
|
|
88
|
+
|
|
89
|
+
현재 세션 맥락과 무관한 요청이 감지되면 psmux 격리를 제안한다.
|
|
90
|
+
|
|
91
|
+
| 확신도 | 신호 | 행동 |
|
|
92
|
+
|--------|------|------|
|
|
93
|
+
| 확실 | "새 탭", "별도로", "새 세션" | 바로 psmux spawn |
|
|
94
|
+
| 높음 | 다른 프로젝트/스택 언급 | 분리 제안 |
|
|
95
|
+
| 중간 | 작업 유형 전환 | 분리 제안 + 현재 세션 옵션 |
|
|
96
|
+
| 낮음 | 현재 작업 연장 | 세션 유지 |
|
|
97
|
+
</session-context>
|
|
98
|
+
|
|
99
|
+
<psmux-wt>
|
|
100
|
+
## psmux/WT 규칙
|
|
101
|
+
|
|
102
|
+
psmux 세션·WT 패인을 생성/조작/정리할 때 `tfx-psmux-rules` 스킬을 참조한다.
|
|
103
|
+
WT 프리징 방지: exit → sleep 2 → kill 순서. 바로 kill하지 않는다.
|
|
104
|
+
|
|
105
|
+
### wt.exe → wt-manager 경유
|
|
106
|
+
|
|
107
|
+
safety-guard가 `wt.exe`, `wt new-tab`, `wt split-pane`, `Start-Process wt`를 차단한다.
|
|
108
|
+
`hub/team/wt-manager.mjs`의 API를 사용한다.
|
|
109
|
+
|
|
110
|
+
| 용도 | API |
|
|
111
|
+
|------|-----|
|
|
112
|
+
| 새 탭 | `createTab({ title, command, profile, cwd })` |
|
|
113
|
+
| 패인 분할 | `splitPane({ direction: 'H'\|'V', title, command })` |
|
|
114
|
+
| 다중 배치 | `applySplitLayout([{ title, command, direction }])` |
|
|
115
|
+
| 탭 정리 | `closeTab(title)` / `closeStale({ olderThanMs, titlePattern })` |
|
|
116
|
+
|
|
117
|
+
차단과 대안은 항상 쌍으로 존재해야 한다. 차단만 추가하고 대안을 안 만들면 데드락.
|
|
118
|
+
|
|
119
|
+
### psmux에서 Codex 실행
|
|
120
|
+
|
|
121
|
+
| 방식 | 동작 | 이유 |
|
|
122
|
+
|------|------|------|
|
|
123
|
+
| `codex` (interactive) | 불가 | psmux에서 TTY를 못 잡음 |
|
|
124
|
+
| `codex < prompt.md` | 불가 | "stdin is not a terminal" |
|
|
125
|
+
| `codex exec "$(cat prompt.md)" -s danger-full-access --dangerously-bypass-approvals-and-sandbox` | 사용 | 유일한 안전 경로 |
|
|
126
|
+
|
|
127
|
+
`codex exec`는 config.toml `approval_mode`를 무시하므로 `--dangerously-bypass-approvals-and-sandbox` 필수.
|
|
128
|
+
`-s` 유효값: read-only, workspace-write, danger-full-access.
|
|
129
|
+
</psmux-wt>
|
|
130
|
+
|
|
131
|
+
<codex-config>
|
|
132
|
+
## Codex config.toml
|
|
133
|
+
|
|
134
|
+
config.toml에 이미 설정된 값은 CLI 플래그로 중복 지정하지 않는다.
|
|
135
|
+
|
|
136
|
+
| config.toml에 있으면 | CLI에서 생략 |
|
|
137
|
+
|---------------------|-------------|
|
|
138
|
+
| `sandbox = "elevated"` | `--full-auto` |
|
|
139
|
+
| `approval_mode = "full-auto"` | `--full-auto` |
|
|
140
|
+
|
|
141
|
+
안전 패턴: config.toml에 기본값을 두고, CLI에서는 `--profile` 선택만 한다.
|
|
142
|
+
</codex-config>
|
|
143
|
+
|
|
144
|
+
<remote>
|
|
145
|
+
## 원격 실행
|
|
146
|
+
|
|
147
|
+
### 스킬 구분
|
|
148
|
+
|
|
149
|
+
| 스킬 | 대상 | 방식 |
|
|
150
|
+
|------|------|------|
|
|
151
|
+
| tfx-codex-swarm | 로컬 전용 | 로컬 worktree + psmux |
|
|
152
|
+
| tfx-remote-spawn | Claude Code 원격 | SSH → Claude Code 세션 → 내부 tfx 라우팅 |
|
|
153
|
+
|
|
154
|
+
codex를 SSH 너머로 직접 실행하지 않는다. config.toml 충돌 + TTY 문제.
|
|
155
|
+
원격에서 codex가 필요하면: remote-spawn → Claude Code → Claude가 내부에서 codex 호출.
|
|
156
|
+
|
|
157
|
+
### SSH 패턴
|
|
158
|
+
|
|
159
|
+
- 인라인 쿼팅 대신 scp + `pwsh -File` 패턴 사용
|
|
160
|
+
- SSH 전송 중 `$var` 전개 주의, PowerShell 변수는 인라인 불가
|
|
161
|
+
- `~` → `$HOME` 변환 필수, 원격 기본 셸 = PowerShell
|
|
162
|
+
</remote>
|
|
163
|
+
|
|
164
|
+
<cross-review>
|
|
165
|
+
## 교차 검증
|
|
166
|
+
|
|
167
|
+
- Claude 작성 코드 → Codex 리뷰
|
|
168
|
+
- Codex 작성 코드 → Claude 리뷰
|
|
169
|
+
- 동일 모델 self-approve 하지 않는다
|
|
170
|
+
- git commit 전 미검증 파일 감지 시 nudge
|
|
171
|
+
</cross-review>
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
12
|
<strong>Tri-CLI Orchestration with Consensus Intelligence</strong><br>
|
|
13
|
-
<em>Claude + Codex + Gemini — natural language routing, cross-model review,
|
|
13
|
+
<em>Claude + Codex + Gemini — natural language routing, cross-model review, 42 skills with Deep/Light variants.</em>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
@@ -75,12 +75,24 @@ tfx setup
|
|
|
75
75
|
|
|
76
76
|
# Remote — spawn Claude sessions on other machines
|
|
77
77
|
/tfx-remote-setup # interactive host wizard (Tailscale + SSH)
|
|
78
|
-
/tfx-remote-spawn "run security review on
|
|
78
|
+
/tfx-remote-spawn "run security review on my-server" # spawn on remote host
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
---
|
|
82
82
|
|
|
83
|
-
## What's New in
|
|
83
|
+
## What's New in v10
|
|
84
|
+
|
|
85
|
+
**triflux v10** completes the **4-Lake Roadmap** — a systematic hardening of every layer from CLI stability to remote multi-agent orchestration.
|
|
86
|
+
|
|
87
|
+
### v10 Highlights
|
|
88
|
+
|
|
89
|
+
- **Lake 1: CLI Stability** — Retry, stall detection, version cache. Zero silent failures
|
|
90
|
+
- **Lake 2: Plugin Isolation** — cli-adapter-base, team-bridge, pack.mjs sync
|
|
91
|
+
- **Lake 3: Remote Infrastructure** — SSH keepalive/retry, hosts.json capability routing, remote handoff, MCP singleton daemon
|
|
92
|
+
- **Lake 4: Token Optimization** — Skill template engine, shared segments, manifest separation. 62% prompt token reduction
|
|
93
|
+
- **Lake 5: Agent Mesh** — Message routing, per-agent queues, heartbeat monitoring, Conductor integration
|
|
94
|
+
|
|
95
|
+
### v9 (carried forward)
|
|
84
96
|
|
|
85
97
|
**triflux v9** introduces **Harness-Native Intelligence** — speak naturally, and triflux routes to the right skill automatically. Cross-model review ensures no model approves its own work.
|
|
86
98
|
|
|
@@ -141,7 +153,7 @@ Phase 3: Resolution (if consensus < 70%)
|
|
|
141
153
|
|-------|------|-------------|--------|
|
|
142
154
|
| `tfx-research` | Light | Quick web search via Exa/Brave/Tavily auto-selection | ~5K |
|
|
143
155
|
| `tfx-deep-research` | Deep | Multi-source parallel search with 3-CLI cross-validation | ~50K |
|
|
144
|
-
| `tfx-
|
|
156
|
+
| `tfx-find` | Light | Fast codebase search — files, symbols, patterns via Haiku | ~3K |
|
|
145
157
|
| `tfx-autoresearch` | Light | Autonomous web research to structured report | ~15K |
|
|
146
158
|
|
|
147
159
|
### Analysis
|
|
@@ -155,9 +167,9 @@ Phase 3: Resolution (if consensus < 70%)
|
|
|
155
167
|
|
|
156
168
|
| Skill | Type | Description | Tokens |
|
|
157
169
|
|-------|------|-------------|--------|
|
|
158
|
-
| `tfx-autopilot` | Light | Simple autonomous task execution | ~10K |
|
|
159
|
-
| `tfx-
|
|
160
|
-
| `tfx-auto` | — | Unified CLI orchestrator with command shortcuts | varies |
|
|
170
|
+
| `tfx-autopilot` | Light | Simple autonomous task execution (single file, <5min) | ~10K |
|
|
171
|
+
| `tfx-fullcycle` | Deep | Full pipeline: Design → Plan → Execute → QA → Verify | ~80K |
|
|
172
|
+
| `tfx-auto` | — | Unified CLI orchestrator with command shortcuts + auto-triage | varies |
|
|
161
173
|
|
|
162
174
|
### QA & Verification
|
|
163
175
|
|
|
@@ -191,8 +203,9 @@ Phase 3: Resolution (if consensus < 70%)
|
|
|
191
203
|
|
|
192
204
|
| Skill | Type | Description | Tokens |
|
|
193
205
|
|-------|------|-------------|--------|
|
|
194
|
-
| `tfx-persist` | Deep | 3-party verified persistence loop until done
|
|
195
|
-
| `tfx-
|
|
206
|
+
| `tfx-persist` | Deep | 3-party verified persistence loop until done | varies |
|
|
207
|
+
| `tfx-ralph` | — | Alias for `tfx-persist` | varies |
|
|
208
|
+
| `tfx-autoroute` | Light | Auto-routing with model escalation on failure | varies |
|
|
196
209
|
|
|
197
210
|
### Meta & Utility
|
|
198
211
|
|
|
@@ -201,7 +214,8 @@ Phase 3: Resolution (if consensus < 70%)
|
|
|
201
214
|
| `tfx-index` | Light | 94% token reduction via project indexing (58K→3K) | ~2K |
|
|
202
215
|
| `tfx-forge` | Light | Create new skills interactively | ~10K |
|
|
203
216
|
| `tfx-interview` | Light | Socratic requirements exploration | ~15K |
|
|
204
|
-
| `tfx-
|
|
217
|
+
| `tfx-deep-interview` | Deep | Socratic deep interview with ambiguity gating | ~25K |
|
|
218
|
+
| `tfx-prune` | Light | AI slop removal — dead code, over-abstraction cleanup | ~10K |
|
|
205
219
|
|
|
206
220
|
### Infrastructure
|
|
207
221
|
|
|
@@ -210,13 +224,16 @@ Phase 3: Resolution (if consensus < 70%)
|
|
|
210
224
|
| `tfx-consensus` | Core consensus engine (internal, used by all Deep skills) |
|
|
211
225
|
| `tfx-hub` | MCP message bus management |
|
|
212
226
|
| `tfx-multi` | Multi-CLI team orchestration |
|
|
227
|
+
| `tfx-codex-swarm` | Parallel Codex sessions via worktree + psmux |
|
|
228
|
+
| `tfx-swarm` | Unified swarm orchestration |
|
|
213
229
|
| `tfx-setup` | Initial setup wizard |
|
|
214
230
|
| `tfx-doctor` | Diagnostics and auto-repair |
|
|
215
|
-
| `tfx-
|
|
231
|
+
| `tfx-hooks` | Claude Code hook priority manager |
|
|
232
|
+
| `tfx-profile` | Codex/Gemini CLI profile management |
|
|
216
233
|
| `tfx-codex` | Codex-only orchestrator |
|
|
217
234
|
| `tfx-gemini` | Gemini-only orchestrator |
|
|
218
235
|
| `tfx-auto-codex` | Codex-lead orchestrator |
|
|
219
|
-
| `tfx-remote-spawn` | Remote session management via psmux |
|
|
236
|
+
| `tfx-remote-spawn` | Remote session management via psmux + SSH |
|
|
220
237
|
| `tfx-remote-setup` | Remote host setup wizard (Tailscale + SSH) |
|
|
221
238
|
|
|
222
239
|
---
|
|
@@ -326,9 +343,9 @@ tfx setup
|
|
|
326
343
|
|
|
327
344
|
## Research Foundation
|
|
328
345
|
|
|
329
|
-
The v8 skill suite was
|
|
346
|
+
The v8 skill suite was inspired by patterns and ideas from across the Claude Code ecosystem:
|
|
330
347
|
|
|
331
|
-
| Project | Stars |
|
|
348
|
+
| Project | Stars | Inspiration |
|
|
332
349
|
|---------|-------|-------------------|
|
|
333
350
|
| everything-claude-code | 114K | Instinct-based learning patterns |
|
|
334
351
|
| Superpowers | 93K | TDD enforcement, composable skills |
|
|
@@ -363,7 +380,7 @@ The v8 skill suite was designed after comprehensive reverse-engineering of 37 cl
|
|
|
363
380
|
|
|
364
381
|
## QoS Dashboard
|
|
365
382
|
|
|
366
|
-
Monitor orchestration health
|
|
383
|
+
Monitor orchestration health via the built-in QoS Dashboard (run `tfx doctor` for URL).
|
|
367
384
|
|
|
368
385
|
- **AIMD Batch Sizing** — Auto-scales parallel tasks based on success rates
|
|
369
386
|
- **Token Savings** — Real-time tracking of Claude tokens saved
|
package/bin/triflux.mjs
CHANGED
|
@@ -284,6 +284,16 @@ function handleFatalError(error, { json = false } = {}) {
|
|
|
284
284
|
process.exit(exitCode);
|
|
285
285
|
}
|
|
286
286
|
|
|
287
|
+
function renderErrorMessage(message, fallback = "unknown error") {
|
|
288
|
+
if (typeof message === "string") {
|
|
289
|
+
const normalized = message.trim().toLowerCase();
|
|
290
|
+
if (normalized.length > 0 && normalized !== "undefined" && normalized !== "null") {
|
|
291
|
+
return message.trim();
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return fallback;
|
|
295
|
+
}
|
|
296
|
+
|
|
287
297
|
function which(cmd) {
|
|
288
298
|
try {
|
|
289
299
|
const result = process.platform === "win32"
|
|
@@ -706,11 +716,45 @@ function previewMcpRegistrationActions(mcpUrl) {
|
|
|
706
716
|
return actions;
|
|
707
717
|
}
|
|
708
718
|
|
|
719
|
+
function previewClaudeRoutingAction() {
|
|
720
|
+
const globalClaudePath = join(CLAUDE_DIR, "CLAUDE.md");
|
|
721
|
+
const projectClaudePath = join(PKG_ROOT, "CLAUDE.md");
|
|
722
|
+
const projectContent = existsSync(projectClaudePath)
|
|
723
|
+
? readFileSync(projectClaudePath, "utf8")
|
|
724
|
+
: "";
|
|
725
|
+
const projectSection = extractMarkdownSection(projectContent, TFX_SECTION_HEADING);
|
|
726
|
+
|
|
727
|
+
if (!projectSection) {
|
|
728
|
+
return {
|
|
729
|
+
type: "claude-guidance",
|
|
730
|
+
path: globalClaudePath,
|
|
731
|
+
source: projectClaudePath,
|
|
732
|
+
change: "skip",
|
|
733
|
+
reason: "project-section-missing",
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
const globalContent = existsSync(globalClaudePath)
|
|
738
|
+
? readFileSync(globalClaudePath, "utf8")
|
|
739
|
+
: "";
|
|
740
|
+
const preview = ensureTfxSection(globalContent, { scope: "global", projectSection });
|
|
741
|
+
|
|
742
|
+
return {
|
|
743
|
+
type: "claude-guidance",
|
|
744
|
+
path: globalClaudePath,
|
|
745
|
+
source: projectClaudePath,
|
|
746
|
+
change: preview.changed ? (existsSync(globalClaudePath) ? "update" : "create") : "noop",
|
|
747
|
+
heading: TFX_SECTION_HEADING,
|
|
748
|
+
summary: TFX_GLOBAL_SUMMARY_SECTION,
|
|
749
|
+
};
|
|
750
|
+
}
|
|
751
|
+
|
|
709
752
|
function buildSetupDryRunPlan() {
|
|
710
753
|
const actions = [
|
|
711
754
|
...SYNC_MAP.map(({ src, dst, label }) => describeSyncAction(src, dst, label)),
|
|
712
755
|
...listSkillSyncActions(),
|
|
713
756
|
];
|
|
757
|
+
actions.push(previewClaudeRoutingAction());
|
|
714
758
|
const codexProfiles = previewCodexProfiles();
|
|
715
759
|
actions.push({
|
|
716
760
|
type: "codex-profiles",
|
|
@@ -742,6 +786,12 @@ function cmdSetup(options = {}) {
|
|
|
742
786
|
for (const target of SYNC_MAP) {
|
|
743
787
|
syncFile(target.src, target.dst, target.label);
|
|
744
788
|
}
|
|
789
|
+
{
|
|
790
|
+
const claudeGuide = ensureGlobalClaudeRoutingSection();
|
|
791
|
+
if (!claudeGuide.ok) warn(`CLAUDE.md 라우팅 섹션 확인 실패: ${claudeGuide.reason}`);
|
|
792
|
+
else if (claudeGuide.changed) ok("CLAUDE.md: 전역 triflux 라우팅 요약 갱신");
|
|
793
|
+
else ok("CLAUDE.md: 전역 triflux 라우팅 요약 유지");
|
|
794
|
+
}
|
|
745
795
|
|
|
746
796
|
// 스킬 동기화 (~/.claude/skills/{name}/SKILL.md)
|
|
747
797
|
const skillsSrc = join(PKG_ROOT, "skills");
|
|
@@ -838,8 +888,9 @@ function cmdSetup(options = {}) {
|
|
|
838
888
|
|
|
839
889
|
const codexProfileResult = ensureCodexProfiles();
|
|
840
890
|
if (!codexProfileResult.ok) {
|
|
841
|
-
|
|
842
|
-
|
|
891
|
+
const reason = renderErrorMessage(codexProfileResult.message);
|
|
892
|
+
warn(`Codex profiles 설정 실패: ${reason}`);
|
|
893
|
+
summary.push({ item: "Codex profiles", status: "⚠️", detail: reason });
|
|
843
894
|
} else if (codexProfileResult.changed > 0) {
|
|
844
895
|
ok(`Codex profiles: ${codexProfileResult.changed}개 반영됨 (~/.codex/config.toml)`);
|
|
845
896
|
summary.push({ item: "Codex profiles", status: "✅", detail: `${codexProfileResult.changed}개 반영됨` });
|
|
@@ -851,8 +902,9 @@ function cmdSetup(options = {}) {
|
|
|
851
902
|
// Gemini 프로필
|
|
852
903
|
const geminiResult = ensureGeminiProfiles();
|
|
853
904
|
if (!geminiResult.ok) {
|
|
854
|
-
|
|
855
|
-
|
|
905
|
+
const reason = renderErrorMessage(geminiResult.message);
|
|
906
|
+
warn(`Gemini profiles 설정 실패: ${reason}`);
|
|
907
|
+
summary.push({ item: "Gemini profiles", status: "⚠️", detail: reason });
|
|
856
908
|
} else if (geminiResult.created) {
|
|
857
909
|
ok(`Gemini profiles: ${geminiResult.count}개 생성됨 (~/.gemini/triflux-profiles.json)`);
|
|
858
910
|
summary.push({ item: "Gemini profiles", status: "✅", detail: `${geminiResult.count}개 생성됨` });
|
|
@@ -1320,6 +1372,11 @@ async function cmdDoctor(options = {}) {
|
|
|
1320
1372
|
for (const target of SYNC_MAP) {
|
|
1321
1373
|
syncFile(target.src, target.dst, target.label);
|
|
1322
1374
|
}
|
|
1375
|
+
{
|
|
1376
|
+
const claudeGuide = ensureGlobalClaudeRoutingSection();
|
|
1377
|
+
if (!claudeGuide.ok) warn(`CLAUDE.md 라우팅 섹션 확인 실패: ${claudeGuide.reason}`);
|
|
1378
|
+
else if (claudeGuide.changed) ok("CLAUDE.md: 전역 triflux 라우팅 요약 갱신");
|
|
1379
|
+
}
|
|
1323
1380
|
// 스킬 동기화
|
|
1324
1381
|
const fSkillsSrc = join(PKG_ROOT, "skills");
|
|
1325
1382
|
const fSkillsDst = join(CLAUDE_DIR, "skills");
|
|
@@ -1340,7 +1397,7 @@ async function cmdDoctor(options = {}) {
|
|
|
1340
1397
|
}
|
|
1341
1398
|
const profileFix = ensureCodexProfiles();
|
|
1342
1399
|
if (!profileFix.ok) {
|
|
1343
|
-
warn(`Codex Profiles 자동 복구 실패: ${profileFix.message}`);
|
|
1400
|
+
warn(`Codex Profiles 자동 복구 실패: ${renderErrorMessage(profileFix.message)}`);
|
|
1344
1401
|
} else if (profileFix.changed > 0) {
|
|
1345
1402
|
ok(`Codex Profiles: ${profileFix.changed}개 반영됨`);
|
|
1346
1403
|
} else {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// hooks/agent-route-guard.mjs — PreToolUse:Agent 훅
|
|
3
|
+
// 서브에이전트 스폰 시 triflux 컨텍스트를 구조화 JSON으로 주입한다.
|
|
4
|
+
// - subagent_type별 최적 라우팅 가이드
|
|
5
|
+
// - tfx-multi 활성 상태 시 headless dispatch 강제
|
|
6
|
+
// - 프로젝트 컨텍스트 자동 첨부
|
|
7
|
+
|
|
8
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
|
|
12
|
+
const TFX_MULTI_STATE = join(tmpdir(), "tfx-multi-state.json");
|
|
13
|
+
const EXPIRE_MS = 30 * 60 * 1000; // 30분
|
|
14
|
+
|
|
15
|
+
// 서브에이전트 타입별 라우팅 힌트
|
|
16
|
+
const AGENT_HINTS = {
|
|
17
|
+
"general-purpose": "범용 에이전트. tfx 스킬이 활성이면 스킬 MD의 라우팅을 우선한다.",
|
|
18
|
+
Explore: "탐색 전용. 파일 수정 불가. Glob/Grep/Read만 사용.",
|
|
19
|
+
Plan: "설계 전용. 파일 수정 불가. 구현 계획 반환.",
|
|
20
|
+
"oh-my-claudecode:executor": "OMC executor. triflux 프로젝트에서는 tfx-auto 라우팅을 우선.",
|
|
21
|
+
"oh-my-claudecode:code-reviewer": "OMC 리뷰어. 교차 리뷰 시 CLAUDE.md 교차 검증 규칙 준수.",
|
|
22
|
+
"oh-my-claudecode:architect": "OMC 아키텍트. READ-ONLY.",
|
|
23
|
+
"oh-my-claudecode:debugger": "OMC 디버거. 근본 원인 분석 집중.",
|
|
24
|
+
"oh-my-claudecode:test-engineer": "OMC 테스트. npm test 실행 후 결과 반환.",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function readStdin() {
|
|
28
|
+
try {
|
|
29
|
+
return readFileSync(0, "utf8");
|
|
30
|
+
} catch {
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function getTfxMultiState() {
|
|
36
|
+
if (!existsSync(TFX_MULTI_STATE)) return null;
|
|
37
|
+
try {
|
|
38
|
+
const state = JSON.parse(readFileSync(TFX_MULTI_STATE, "utf8"));
|
|
39
|
+
if (Date.now() - state.activatedAt > EXPIRE_MS) return null;
|
|
40
|
+
return state.active ? state : null;
|
|
41
|
+
} catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function buildContext(agentType, prompt) {
|
|
47
|
+
const parts = [];
|
|
48
|
+
|
|
49
|
+
// 1. tfx-multi 활성 상태 확인
|
|
50
|
+
const multiState = getTfxMultiState();
|
|
51
|
+
if (multiState) {
|
|
52
|
+
parts.push(
|
|
53
|
+
"[tfx-multi ACTIVE] headless dispatch 모드. " +
|
|
54
|
+
"CLI 작업은 Bash(tfx-route.sh)를 통해 실행하세요."
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 2. 에이전트 타입별 힌트
|
|
59
|
+
const hint = AGENT_HINTS[agentType];
|
|
60
|
+
if (hint) {
|
|
61
|
+
parts.push(`[Agent:${agentType}] ${hint}`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 3. 프로젝트 컨텍스트
|
|
65
|
+
parts.push(
|
|
66
|
+
"triflux 프로젝트: subagent_type 미지정 시 'general-purpose' 기본. " +
|
|
67
|
+
"tfx-* 스킬 활성 시 스킬 MD 라우팅 우선."
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return parts.join("\n");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function main() {
|
|
74
|
+
const raw = readStdin();
|
|
75
|
+
if (!raw.trim()) process.exit(0);
|
|
76
|
+
|
|
77
|
+
let input;
|
|
78
|
+
try {
|
|
79
|
+
input = JSON.parse(raw);
|
|
80
|
+
} catch {
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (input.tool_name !== "Agent") process.exit(0);
|
|
85
|
+
|
|
86
|
+
const toolInput = input.tool_input || {};
|
|
87
|
+
const agentType = toolInput.subagent_type || toolInput.agent || "general-purpose";
|
|
88
|
+
const prompt = toolInput.prompt || "";
|
|
89
|
+
|
|
90
|
+
const context = buildContext(agentType, prompt);
|
|
91
|
+
|
|
92
|
+
// 구조화된 hookSpecificOutput 반환
|
|
93
|
+
const output = {
|
|
94
|
+
hookSpecificOutput: {
|
|
95
|
+
hookEventName: "PreToolUse",
|
|
96
|
+
permissionDecision: "allow",
|
|
97
|
+
additionalContext: context,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
process.stdout.write(JSON.stringify(output));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
main();
|
|
106
|
+
} catch {
|
|
107
|
+
// 훅 실패 시 블로킹하지 않음
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// hooks/cross-review-tracker.mjs — PostToolUse:Edit|Write 훅
|
|
3
|
+
//
|
|
4
|
+
// 파일 수정을 추적하여 교차 리뷰 미검증 파일을 감지한다.
|
|
5
|
+
// CLAUDE.md 규칙: "Claude 작성 코드 → Codex 리뷰, Codex 작성 → Claude 리뷰"
|
|
6
|
+
//
|
|
7
|
+
// 동작:
|
|
8
|
+
// 1. Edit/Write 성공 시 수정된 파일 경로를 상태 파일에 누적
|
|
9
|
+
// 2. 일정 수(REVIEW_THRESHOLD) 이상 미검증 파일이 쌓이면 nudge 메시지 주입
|
|
10
|
+
// 3. git commit 전 미검증 파일 경고
|
|
11
|
+
|
|
12
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
13
|
+
import { join, relative } from "node:path";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
|
|
16
|
+
const STATE_DIR = join(tmpdir(), "tfx-cross-review");
|
|
17
|
+
const STATE_FILE = join(STATE_DIR, "pending-review.json");
|
|
18
|
+
const REVIEW_THRESHOLD = 5; // 이 수 이상 미검증 파일 → nudge
|
|
19
|
+
const EXPIRE_MS = 60 * 60 * 1000; // 1시간 후 자동 만료
|
|
20
|
+
|
|
21
|
+
// 코드 파일만 추적 (설정/문서/빌드 산출물 제외)
|
|
22
|
+
const CODE_EXTENSIONS = new Set([
|
|
23
|
+
".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx",
|
|
24
|
+
".py", ".rs", ".go", ".java", ".c", ".cpp", ".h",
|
|
25
|
+
".vue", ".svelte", ".sh", ".bash", ".ps1",
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
function isCodeFile(filePath) {
|
|
29
|
+
if (!filePath) return false;
|
|
30
|
+
const ext = filePath.slice(filePath.lastIndexOf(".")).toLowerCase();
|
|
31
|
+
return CODE_EXTENSIONS.has(ext);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function loadState() {
|
|
35
|
+
if (!existsSync(STATE_FILE)) {
|
|
36
|
+
return { files: {}, startedAt: Date.now() };
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const state = JSON.parse(readFileSync(STATE_FILE, "utf8"));
|
|
40
|
+
// 만료 체크
|
|
41
|
+
if (Date.now() - state.startedAt > EXPIRE_MS) {
|
|
42
|
+
return { files: {}, startedAt: Date.now() };
|
|
43
|
+
}
|
|
44
|
+
return state;
|
|
45
|
+
} catch {
|
|
46
|
+
return { files: {}, startedAt: Date.now() };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function saveState(state) {
|
|
51
|
+
mkdirSync(STATE_DIR, { recursive: true });
|
|
52
|
+
writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function readStdin() {
|
|
56
|
+
try {
|
|
57
|
+
return readFileSync(0, "utf8");
|
|
58
|
+
} catch {
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function main() {
|
|
64
|
+
const raw = readStdin();
|
|
65
|
+
if (!raw.trim()) process.exit(0);
|
|
66
|
+
|
|
67
|
+
let input;
|
|
68
|
+
try {
|
|
69
|
+
input = JSON.parse(raw);
|
|
70
|
+
} catch {
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const toolName = input.tool_name || "";
|
|
75
|
+
if (toolName !== "Edit" && toolName !== "Write") process.exit(0);
|
|
76
|
+
|
|
77
|
+
const toolInput = input.tool_input || {};
|
|
78
|
+
const filePath = toolInput.file_path || "";
|
|
79
|
+
|
|
80
|
+
if (!filePath || !isCodeFile(filePath)) process.exit(0);
|
|
81
|
+
|
|
82
|
+
// 프로젝트 루트 기준 상대 경로
|
|
83
|
+
const cwd = input.cwd || process.cwd();
|
|
84
|
+
const relPath = relative(cwd, filePath) || filePath;
|
|
85
|
+
|
|
86
|
+
// 상태 갱신: 파일 추가
|
|
87
|
+
const state = loadState();
|
|
88
|
+
state.files[relPath] = {
|
|
89
|
+
tool: toolName,
|
|
90
|
+
modifiedAt: Date.now(),
|
|
91
|
+
reviewed: false,
|
|
92
|
+
};
|
|
93
|
+
saveState(state);
|
|
94
|
+
|
|
95
|
+
// 미검증 파일 수 체크
|
|
96
|
+
const unreviewed = Object.entries(state.files).filter(
|
|
97
|
+
([, v]) => !v.reviewed
|
|
98
|
+
);
|
|
99
|
+
const count = unreviewed.length;
|
|
100
|
+
|
|
101
|
+
if (count >= REVIEW_THRESHOLD) {
|
|
102
|
+
// nudge 메시지 주입
|
|
103
|
+
const fileList = unreviewed
|
|
104
|
+
.slice(0, 8)
|
|
105
|
+
.map(([f]) => ` - ${f}`)
|
|
106
|
+
.join("\n");
|
|
107
|
+
|
|
108
|
+
const output = {
|
|
109
|
+
systemMessage:
|
|
110
|
+
`[교차 리뷰 nudge] 미검증 코드 파일 ${count}개:\n${fileList}\n` +
|
|
111
|
+
(count > 8 ? ` ... 외 ${count - 8}개\n` : "") +
|
|
112
|
+
`커밋 전 교차 리뷰를 권장합니다. (Claude→Codex 또는 Codex→Claude)`,
|
|
113
|
+
};
|
|
114
|
+
process.stdout.write(JSON.stringify(output));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
main();
|
|
120
|
+
} catch {
|
|
121
|
+
process.exit(0);
|
|
122
|
+
}
|