triflux 10.0.0 → 10.0.2
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 +1178 -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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Analysis: Selective Spawn without SKILL.md Guidance
|
|
2
|
+
|
|
3
|
+
> Generated: 2026-03-30
|
|
4
|
+
> Eval: `selective-spawn-with-override` (eval_id: 2)
|
|
5
|
+
> Variant: `without_skill`
|
|
6
|
+
|
|
7
|
+
## Task Summary
|
|
8
|
+
|
|
9
|
+
**User request**: "issue 24하고 28번 PRD만 코덱스 스폰해줘. 둘 다 xhigh로 세팅하고 ralph로 끝까지 돌려"
|
|
10
|
+
|
|
11
|
+
**Decomposed requirements**:
|
|
12
|
+
1. Select only issues 24 and 28 from the 7 available PRDs
|
|
13
|
+
2. Override effort level to `xhigh` for both sessions
|
|
14
|
+
3. Use `$ralph` workflow (persist until complete) instead of default `$autopilot`
|
|
15
|
+
4. Spawn as Codex sessions (not Claude Code)
|
|
16
|
+
|
|
17
|
+
## Approach Without Skill Guidance
|
|
18
|
+
|
|
19
|
+
Without the `tfx-codex-swarm` SKILL.md, the agent must rely on:
|
|
20
|
+
|
|
21
|
+
### Knowledge Sources Used
|
|
22
|
+
|
|
23
|
+
| Source | What it provided |
|
|
24
|
+
|--------|-----------------|
|
|
25
|
+
| `.omc/codex-spawn/codex-prd-launcher.sh` | Existing launcher pattern: `codex exec --full-auto` with `-c` flag config overrides |
|
|
26
|
+
| `.omc/codex-spawn/spawn-all.sh` | WT tab spawning pattern using `wt.exe -w new` with `new-tab` chaining |
|
|
27
|
+
| `.omc/codex-spawn/prompt-{24,28}.md` | Existing prompt templates for these specific issues |
|
|
28
|
+
| `~/.codex/config.toml` | Available profiles including `codex53_xhigh` with exact model/effort settings |
|
|
29
|
+
| `.omx/plans/prd-issue-{24,28}.md` | Full PRD content for classification and prompt generation |
|
|
30
|
+
| `tui/codex-profile.mjs` | Effort levels: `low`, `medium`, `high`, `xhigh` |
|
|
31
|
+
| `hub/workers/codex-mcp.mjs` | Codex MCP API surface: model, profile, approvalPolicy, config options |
|
|
32
|
+
| `skills/tfx-ralph/SKILL.md` | Ralph = tfx-persist alias, Tri-Verified Persistence Loop, tier degradation |
|
|
33
|
+
| `.omx/tmux-hook.json` | OMX tmux injection supports ralph/ultrawork/team modes |
|
|
34
|
+
|
|
35
|
+
### What the Skill Would Have Provided
|
|
36
|
+
|
|
37
|
+
The `tfx-codex-swarm` SKILL.md provides a structured 10-step workflow:
|
|
38
|
+
|
|
39
|
+
1. **Task file scan** with defined search paths (`.omx/plans/*.md`, `.omc/plans/*.md`, `docs/prd/*.md`)
|
|
40
|
+
2. **AskUserQuestion-based selection** UI with "전체/선택/최근" options
|
|
41
|
+
3. **Automatic type classification** table (implement/investigate/refactor)
|
|
42
|
+
4. **Size-based profile routing** with explicit thresholds (XL/L/M/S)
|
|
43
|
+
5. **Profile-to-flag mapping** table
|
|
44
|
+
6. **Worktree naming convention** (`.codex-swarm/wt-issue-{N}`)
|
|
45
|
+
7. **Prompt template** structure
|
|
46
|
+
8. **psmux session + Codex launch** commands
|
|
47
|
+
9. **WT tab attach** with psmux-first and wt.exe fallback
|
|
48
|
+
10. **Post-spawn management** (status, merge, cleanup)
|
|
49
|
+
|
|
50
|
+
### Decisions Made Without Skill
|
|
51
|
+
|
|
52
|
+
| Decision | Without Skill | With Skill |
|
|
53
|
+
|----------|--------------|------------|
|
|
54
|
+
| PRD location | Found via `Glob **/*prd*` | Defined scan paths in Step 1 |
|
|
55
|
+
| Selection method | Direct from user request ("24하고 28번") | AskUserQuestion UI (Step 2) |
|
|
56
|
+
| Classification | Manual PRD content analysis | Keyword table lookup (Step 3) |
|
|
57
|
+
| Profile routing | Matched user "xhigh" to `codex53_xhigh` in config.toml | Size assessment -> routing table -> override flow (Step 4) |
|
|
58
|
+
| Worktree path | Copied `.codex-swarm/wt-issue-{N}` from existing patterns | Defined in Step 5 |
|
|
59
|
+
| Prompt structure | Based on existing `.omc/codex-spawn/prompt-{24,28}.md` | Template in Step 6 |
|
|
60
|
+
| Execution mode | `codex` interactive (not `codex exec`) for OMX skill compat | Explicit in Step 7 note |
|
|
61
|
+
| WT attach | psmux attach + wt.exe fallback from spawn-all.sh | Defined in Step 8 |
|
|
62
|
+
|
|
63
|
+
## Critical Difference: `codex` vs `codex exec`
|
|
64
|
+
|
|
65
|
+
The existing `codex-prd-launcher.sh` uses `codex exec --full-auto` (non-interactive). However, this is **incompatible with OMX skills** like `$ralph`. The SKILL.md Step 7 explicitly notes:
|
|
66
|
+
|
|
67
|
+
> "Codex 대화식 모드 실행 -- OMX 스킬($plan, $autopilot 등)이 동작하려면 대화식 필수"
|
|
68
|
+
> "codex exec(비대화식)에서는 OMX $skill이 트리거되지 않으므로 반드시 대화식으로 실행"
|
|
69
|
+
|
|
70
|
+
Without skill guidance, an agent might incorrectly use `codex exec --full-auto` (copying the launcher pattern), which would silently prevent `$ralph` from activating. The without_skill variant here correctly uses interactive `codex` (without `exec`) because the `$ralph` requirement was analyzed against the tfx-ralph SKILL.md.
|
|
71
|
+
|
|
72
|
+
## Assertion Compliance
|
|
73
|
+
|
|
74
|
+
Per `eval_metadata.json`:
|
|
75
|
+
|
|
76
|
+
| Assertion | Status | Evidence |
|
|
77
|
+
|-----------|--------|----------|
|
|
78
|
+
| `only-2-selected` | PASS | commands.sh contains only issue-24 and issue-28. No references to 25, 26, 27, 29, 30. Exactly 2 `git worktree add`, 2 `psmux new-session`, 2 `psmux send-keys` |
|
|
79
|
+
| `xhigh-override` | PASS | routing.md shows `codex53_xhigh` for both. commands.sh uses `model_reasoning_effort="xhigh"` in both send-keys commands |
|
|
80
|
+
| `ralph-skill` | PASS | Prompts contain "$ralph 스킬로 완료될 때까지 반복 실행하세요". classification.md shows `$ralph (user override)` |
|
|
81
|
+
| `worktree-2-only` | PASS | commands.sh has exactly 2 `git worktree add` commands (wt-issue-24, wt-issue-28) |
|
|
82
|
+
|
|
83
|
+
## Risk Notes
|
|
84
|
+
|
|
85
|
+
1. **Interactive mode requirement**: Without SKILL.md, an agent could default to `codex exec` from the existing launcher, breaking `$ralph` activation
|
|
86
|
+
2. **Profile existence**: `codex53_xhigh` must exist in `~/.codex/config.toml` -- verified present
|
|
87
|
+
3. **OMX tmux hook**: `.omx/tmux-hook.json` confirms ralph is in `allowed_modes`, so tmux injection will function
|
|
88
|
+
4. **Tier degradation**: `$ralph` (= tfx-persist) has a 3-tier degradation chain. If psmux/Hub/Codex are unavailable, it falls back to Tier 3 (Claude Agent only). The commands assume Tier 1 (full stack available)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Codex Swarm - PRD Classification (Selective: Issue 24, 28)
|
|
2
|
+
|
|
3
|
+
> Generated: 2026-03-30
|
|
4
|
+
> Source: `.omx/plans/prd-issue-{24,28}.md` (2 PRDs selected from 7 total)
|
|
5
|
+
> User directive: "issue 24하고 28번 PRD만 코덱스 스폰해줘. 둘 다 xhigh로 세팅하고 ralph로 끝까지 돌려"
|
|
6
|
+
> Mode: without_skill (no SKILL.md guidance)
|
|
7
|
+
|
|
8
|
+
## Selection Filter
|
|
9
|
+
|
|
10
|
+
User explicitly requested **only issue 24 and 28**. Issues 25, 26, 27, 29, 30 are excluded.
|
|
11
|
+
|
|
12
|
+
## Classification
|
|
13
|
+
|
|
14
|
+
| # | PRD File | Type | Keywords Found | OMX Skill |
|
|
15
|
+
|---|----------|------|----------------|-----------|
|
|
16
|
+
| 24 | `prd-issue-24-remote-spawn-file-transfer.md` | **implement** | "추가", "변경", "전송" | `$ralph` (user override) |
|
|
17
|
+
| 28 | `prd-issue-28-headless-guard-spawn-deadlock.md` | **implement** | "변경", "개선", "추가" | `$ralph` (user override) |
|
|
18
|
+
|
|
19
|
+
## Classification Logic (without SKILL.md)
|
|
20
|
+
|
|
21
|
+
Without skill guidance, classification is inferred from PRD content analysis:
|
|
22
|
+
|
|
23
|
+
- **Issue 24**: PRD describes adding a file-transfer phase to `remote-spawn.mjs`. Contains action words "추가" (add), "변경" (change). Clear implementation task.
|
|
24
|
+
- **Issue 28**: PRD describes improving `headless-guard.mjs` denial messages and adding regression tests. Contains "변경" (change), "개선" (improve), "추가" (add). Clear implementation task.
|
|
25
|
+
|
|
26
|
+
Both would auto-classify as **implement** under normal routing, which maps to `$plan -> $autopilot`. However, the user explicitly requested `$ralph` (persist until done), overriding the default skill assignment for both tasks.
|
|
27
|
+
|
|
28
|
+
## User Override Summary
|
|
29
|
+
|
|
30
|
+
| Override | Default | Applied |
|
|
31
|
+
|----------|---------|---------|
|
|
32
|
+
| Task selection | all 7 PRDs | **2 PRDs only** (24, 28) |
|
|
33
|
+
| OMX skill | `$plan -> $autopilot` | **`$ralph`** (끝까지 돌려) |
|
|
34
|
+
| Profile/effort | auto-routed per size | **xhigh forced** (둘 다 xhigh) |
|
|
35
|
+
|
|
36
|
+
## Summary
|
|
37
|
+
|
|
38
|
+
- **2 implement** tasks selected: issues 24, 28
|
|
39
|
+
- **5 excluded**: issues 25, 26, 27, 29, 30
|
|
40
|
+
- **Skill override**: `$ralph` for both (user: "ralph로 끝까지 돌려")
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# commands.sh — Codex selective spawn: Issue 24, 28 only
|
|
3
|
+
# Profile: codex53_xhigh | Skill: $ralph | Mode: full-auto
|
|
4
|
+
# Generated: 2026-03-30 (without_skill variant)
|
|
5
|
+
#
|
|
6
|
+
# DO NOT EXECUTE DIRECTLY — this is a generated reference.
|
|
7
|
+
# The commands below show what WOULD be executed.
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
PROJ_DIR="/c/Users/SSAFY/Desktop/Projects/cli/triflux"
|
|
11
|
+
BASH_EXE='C:\Program Files\Git\bin\bash.exe'
|
|
12
|
+
SWARM_DIR="$PROJ_DIR/.codex-swarm"
|
|
13
|
+
|
|
14
|
+
# ============================================================
|
|
15
|
+
# Step 1: Worktree Creation (2 worktrees only)
|
|
16
|
+
# ============================================================
|
|
17
|
+
|
|
18
|
+
cd "$PROJ_DIR"
|
|
19
|
+
|
|
20
|
+
git worktree add "$SWARM_DIR/wt-issue-24" -b codex/issue-24 2>/dev/null || \
|
|
21
|
+
git worktree add "$SWARM_DIR/wt-issue-24" codex/issue-24
|
|
22
|
+
|
|
23
|
+
git worktree add "$SWARM_DIR/wt-issue-28" -b codex/issue-28 2>/dev/null || \
|
|
24
|
+
git worktree add "$SWARM_DIR/wt-issue-28" codex/issue-28
|
|
25
|
+
|
|
26
|
+
# ============================================================
|
|
27
|
+
# Step 2: Copy PRD files to worktrees
|
|
28
|
+
# ============================================================
|
|
29
|
+
|
|
30
|
+
mkdir -p "$SWARM_DIR/wt-issue-24/.omx/plans"
|
|
31
|
+
cp "$PROJ_DIR/.omx/plans/prd-issue-24-remote-spawn-file-transfer.md" \
|
|
32
|
+
"$SWARM_DIR/wt-issue-24/.omx/plans/"
|
|
33
|
+
|
|
34
|
+
mkdir -p "$SWARM_DIR/wt-issue-28/.omx/plans"
|
|
35
|
+
cp "$PROJ_DIR/.omx/plans/prd-issue-28-headless-guard-spawn-deadlock.md" \
|
|
36
|
+
"$SWARM_DIR/wt-issue-28/.omx/plans/"
|
|
37
|
+
|
|
38
|
+
# ============================================================
|
|
39
|
+
# Step 3: Generate Prompts (with $ralph skill directive)
|
|
40
|
+
# ============================================================
|
|
41
|
+
|
|
42
|
+
mkdir -p "$SWARM_DIR/prompts"
|
|
43
|
+
|
|
44
|
+
cat > "$SWARM_DIR/prompts/prompt-24.md" << 'PROMPT_EOF'
|
|
45
|
+
triflux 프로젝트의 PRD를 구현해야 합니다.
|
|
46
|
+
|
|
47
|
+
PRD 파일을 먼저 읽으세요: .omx/plans/prd-issue-24-remote-spawn-file-transfer.md
|
|
48
|
+
|
|
49
|
+
작업 순서:
|
|
50
|
+
1. PRD 파일을 읽고 요구사항을 파악하세요
|
|
51
|
+
2. $ralph 스킬로 완료될 때까지 반복 실행하세요. 멈추지 마세요.
|
|
52
|
+
3. 구현 후 관련 테스트를 작성하고 npm test로 검증하세요
|
|
53
|
+
4. 모든 acceptance criteria를 충족할 때까지 계속하세요
|
|
54
|
+
|
|
55
|
+
핵심 요구사항:
|
|
56
|
+
- remote-spawn에서 --handoff 파일과 참조된 파일을 원격 호스트로 전송
|
|
57
|
+
- 전송 대상은 명시적이고 경계가 명확해야 함
|
|
58
|
+
- MAX_HANDOFF_BYTES 및 로컬 검증 동작 유지
|
|
59
|
+
|
|
60
|
+
프로젝트 컨텍스트:
|
|
61
|
+
- triflux: Claude Code용 멀티모델 CLI 오케스트레이터
|
|
62
|
+
- 언어: JavaScript/ESM (Node.js), 테스트: npm test
|
|
63
|
+
- 핵심 파일: scripts/remote-spawn.mjs
|
|
64
|
+
PROMPT_EOF
|
|
65
|
+
|
|
66
|
+
cat > "$SWARM_DIR/prompts/prompt-28.md" << 'PROMPT_EOF'
|
|
67
|
+
triflux 프로젝트의 PRD를 구현해야 합니다.
|
|
68
|
+
|
|
69
|
+
PRD 파일을 먼저 읽으세요: .omx/plans/prd-issue-28-headless-guard-spawn-deadlock.md
|
|
70
|
+
|
|
71
|
+
작업 순서:
|
|
72
|
+
1. PRD 파일을 읽고 요구사항을 파악하세요
|
|
73
|
+
2. $ralph 스킬로 완료될 때까지 반복 실행하세요. 멈추지 마세요.
|
|
74
|
+
3. 구현 후 관련 테스트를 작성하고 npm test로 검증하세요
|
|
75
|
+
4. 모든 acceptance criteria를 충족할 때까지 계속하세요
|
|
76
|
+
|
|
77
|
+
핵심 요구사항:
|
|
78
|
+
- headless-guard의 거부 메시지를 액션 지향적으로 개선
|
|
79
|
+
- 바이패스(TFX_ALLOW_DIRECT_CLI=1)와 승인된 headless 명령을 같은 응답에 표시
|
|
80
|
+
- 가드 결정 매트릭스에 대한 회귀 테스트 추가
|
|
81
|
+
|
|
82
|
+
프로젝트 컨텍스트:
|
|
83
|
+
- triflux: Claude Code용 멀티모델 CLI 오케스트레이터
|
|
84
|
+
- 언어: JavaScript/ESM (Node.js), 테스트: npm test
|
|
85
|
+
- 핵심 파일: scripts/headless-guard.mjs
|
|
86
|
+
PROMPT_EOF
|
|
87
|
+
|
|
88
|
+
# ============================================================
|
|
89
|
+
# Step 4: psmux Session Creation + Codex Launch
|
|
90
|
+
# ============================================================
|
|
91
|
+
|
|
92
|
+
# --- Issue 24: remote-spawn file transfer ---
|
|
93
|
+
psmux new-session --name "codex-swarm-24" --dir "$SWARM_DIR/wt-issue-24"
|
|
94
|
+
|
|
95
|
+
psmux send-keys --target "codex-swarm-24:0" \
|
|
96
|
+
"codex -c 'model=\"gpt-5.3-codex\"' -c 'model_reasoning_effort=\"xhigh\"' \"\$(cat $SWARM_DIR/prompts/prompt-24.md)\"" Enter
|
|
97
|
+
|
|
98
|
+
# --- Issue 28: headless-guard spawn deadlock ---
|
|
99
|
+
psmux new-session --name "codex-swarm-28" --dir "$SWARM_DIR/wt-issue-28"
|
|
100
|
+
|
|
101
|
+
psmux send-keys --target "codex-swarm-28:0" \
|
|
102
|
+
"codex -c 'model=\"gpt-5.3-codex\"' -c 'model_reasoning_effort=\"xhigh\"' \"\$(cat $SWARM_DIR/prompts/prompt-28.md)\"" Enter
|
|
103
|
+
|
|
104
|
+
# ============================================================
|
|
105
|
+
# Step 5: WT Tab Attach (2 tabs in single window)
|
|
106
|
+
# ============================================================
|
|
107
|
+
|
|
108
|
+
# psmux attach 방식 (우선)
|
|
109
|
+
psmux attach --session "codex-swarm-24" --wt-new-window
|
|
110
|
+
psmux attach --session "codex-swarm-28" --wt-tab
|
|
111
|
+
|
|
112
|
+
# wt.exe fallback (psmux attach 불가 시)
|
|
113
|
+
# wt.exe -w new \
|
|
114
|
+
# --title 'I24-FileTransfer' -d "$SWARM_DIR/wt-issue-24" "$BASH_EXE" -c "psmux attach codex-swarm-24" \; \
|
|
115
|
+
# new-tab --title 'I28-GuardDeadlock' -d "$SWARM_DIR/wt-issue-28" "$BASH_EXE" -c "psmux attach codex-swarm-28"
|
|
116
|
+
|
|
117
|
+
# ============================================================
|
|
118
|
+
# Step 6: Status Report
|
|
119
|
+
# ============================================================
|
|
120
|
+
|
|
121
|
+
echo ""
|
|
122
|
+
echo "=== Codex Selective Spawn Complete ==="
|
|
123
|
+
echo ""
|
|
124
|
+
echo "| # | Task | Type | OMX Skill | Profile | Worktree | Session |"
|
|
125
|
+
echo "|---|------------------|-----------|-----------|----------------|--------------|-----------------|"
|
|
126
|
+
echo "| 24 | file-transfer | implement | \$ralph | codex53_xhigh | wt-issue-24 | codex-swarm-24 |"
|
|
127
|
+
echo "| 28 | guard-deadlock | implement | \$ralph | codex53_xhigh | wt-issue-28 | codex-swarm-28 |"
|
|
128
|
+
echo ""
|
|
129
|
+
echo "Sessions: 2 | Profile: codex53_xhigh | Skill: \$ralph | Mode: full-auto"
|
|
130
|
+
echo "Excluded: issues 25, 26, 27, 29, 30"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Codex Swarm - Profile Routing (Selective: Issue 24, 28 with xhigh override)
|
|
2
|
+
|
|
3
|
+
> Generated: 2026-03-30
|
|
4
|
+
> Mode: without_skill (no SKILL.md guidance)
|
|
5
|
+
|
|
6
|
+
## Size Assessment
|
|
7
|
+
|
|
8
|
+
| # | PRD File | Lines | Affected Files | High-cost Keywords | Dependencies | Size |
|
|
9
|
+
|---|----------|-------|----------------|-------------------|--------------|------|
|
|
10
|
+
| 24 | prd-issue-24 | 73 | 4 (`remote-spawn.mjs`, handoff, scp, staging) | 0 | none | **L** |
|
|
11
|
+
| 28 | prd-issue-28 | 69 | 4 (`headless-guard.mjs`, `hub/team/psmux.mjs`, codex, gemini) | 0 | none | **L** |
|
|
12
|
+
|
|
13
|
+
Both PRDs fall in the **L (standard)** range.
|
|
14
|
+
|
|
15
|
+
## Default Routing (what auto-routing would produce)
|
|
16
|
+
|
|
17
|
+
Under normal routing for L-size implement tasks:
|
|
18
|
+
|
|
19
|
+
| # | Task | Size | Type | Auto Profile | Auto Flags |
|
|
20
|
+
|---|------|------|------|-------------|------------|
|
|
21
|
+
| 24 | file-transfer | L | implement | `codex53_high` | `-c 'model="gpt-5.3-codex"' -c 'model_reasoning_effort="high"'` |
|
|
22
|
+
| 28 | guard-deadlock | L | implement | `codex53_high` | `-c 'model="gpt-5.3-codex"' -c 'model_reasoning_effort="high"'` |
|
|
23
|
+
|
|
24
|
+
## Applied Routing (after user xhigh override)
|
|
25
|
+
|
|
26
|
+
User directive: "둘 다 xhigh로 세팅하고" overrides the auto-routed `codex53_high` to `codex53_xhigh`.
|
|
27
|
+
|
|
28
|
+
| # | Task | Size | Type | Profile | Codex Flags |
|
|
29
|
+
|---|------|------|------|---------|-------------|
|
|
30
|
+
| 24 | file-transfer | L | implement | **`codex53_xhigh`** | `-c 'model="gpt-5.3-codex"' -c 'model_reasoning_effort="xhigh"'` |
|
|
31
|
+
| 28 | guard-deadlock | L | implement | **`codex53_xhigh`** | `-c 'model="gpt-5.3-codex"' -c 'model_reasoning_effort="xhigh"'` |
|
|
32
|
+
|
|
33
|
+
### Profile Resolution
|
|
34
|
+
|
|
35
|
+
`codex53_xhigh` maps to the existing Codex config profile `[profiles.codex53_xhigh]`:
|
|
36
|
+
```toml
|
|
37
|
+
[profiles.codex53_xhigh]
|
|
38
|
+
model = "gpt-5.3-codex"
|
|
39
|
+
model_reasoning_effort = "xhigh"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
This profile exists in `~/.codex/config.toml`, so either `-c` inline flags or `--profile codex53_xhigh` can be used.
|
|
43
|
+
|
|
44
|
+
## Execution Defaults
|
|
45
|
+
|
|
46
|
+
| Setting | Value | Note |
|
|
47
|
+
|---------|-------|------|
|
|
48
|
+
| Mode | `--full-auto` | Sandbox auto-approve (YOLO) |
|
|
49
|
+
| Worktree | enabled | Per-session independent worktree |
|
|
50
|
+
| psmux | enabled | Session management via send-keys |
|
|
51
|
+
| WT | 2 tabs in single window | Only 2 sessions (not 7) |
|
|
52
|
+
| OMX skill | `$ralph` | Persist loop until task fully complete |
|
|
53
|
+
|
|
54
|
+
## Cost / Duration Estimate
|
|
55
|
+
|
|
56
|
+
| Factor | Value |
|
|
57
|
+
|--------|-------|
|
|
58
|
+
| Model | gpt-5.3-codex (SWE-Bench 72%, Terminal-Bench 77%) |
|
|
59
|
+
| Effort | xhigh (maximum reasoning, slowest) |
|
|
60
|
+
| Sessions | 2 concurrent |
|
|
61
|
+
| Expected duration | 15-45 min per session (xhigh adds ~2-3x vs high) |
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-deep-interview
|
|
3
3
|
description: >
|
|
4
|
-
구현 전 소크라테스식 질의로 요구사항 깊이
|
|
4
|
+
구현 전 소크라테스식 질의로 요구사항 깊이 탐색.
|
|
5
5
|
5단계 인터뷰를 통해 요구사항을 명확히 하고 최적 구현 경로를 도출합니다.
|
|
6
|
-
NOTE: deep- 접두사이지만 Gemini 단독 분석 스킬. 3-CLI Deep 규약의 예외.
|
|
7
6
|
triggers:
|
|
8
7
|
- deep-interview
|
|
9
8
|
- 딥인터뷰
|
|
@@ -9,10 +9,9 @@ triggers:
|
|
|
9
9
|
argument-hint: "<구현할 기능 설명>"
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# {{SKILL_NAME}} — Light Implementation Plan
|
|
13
13
|
|
|
14
|
-
>
|
|
15
|
-
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
14
|
+
{{> base}}
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
> **Deep 버전**: tfx-deep-plan. "제대로/꼼꼼히" 수정자로 자동 에스컬레이션.
|
|
@@ -294,14 +294,23 @@ wt.exe -w 0 sp -V -p triflux ...
|
|
|
294
294
|
|
|
295
295
|
---
|
|
296
296
|
|
|
297
|
-
## RULE 6:
|
|
297
|
+
## RULE 6: WT 탭/창은 wt-manager 경유 필수
|
|
298
|
+
|
|
299
|
+
- `wt.exe new-tab ...` 직접 호출 금지
|
|
300
|
+
- `wt.exe split-pane ...` 직접 호출 금지
|
|
301
|
+
- `Start-Process wt.exe ...` PowerShell 호출 금지
|
|
302
|
+
- 반드시 wt-manager.mjs의 createTab() / applyLayout() 사용
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## RULE 7: spark53 프로파일은 Pro 전용
|
|
298
307
|
|
|
299
308
|
`spark53_med`, `spark53_low` 등 spark 모델 프로파일은 **Codex Pro 구독 전용**이다.
|
|
300
309
|
비-Pro 환경에서는 `codex53_low`로 폴백한다.
|
|
301
310
|
|
|
302
311
|
---
|
|
303
312
|
|
|
304
|
-
## RULE
|
|
313
|
+
## RULE 8: WT 레이아웃 선택 필수
|
|
305
314
|
|
|
306
315
|
WT에 패인을 배치하기 전에 **반드시** 사용자에게 레이아웃을 확인한다.
|
|
307
316
|
새 탭(`nt`)은 금지 — split + dashboard가 기본.
|
|
@@ -9,10 +9,9 @@ triggers:
|
|
|
9
9
|
argument-hint: "[테스트 명령 또는 파일 경로]"
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# {{SKILL_NAME}} — Light Test-Fix Cycle
|
|
13
13
|
|
|
14
|
-
>
|
|
15
|
-
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
14
|
+
{{> base}}
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
> **Deep 버전**: tfx-deep-qa. "제대로/꼼꼼히" 수정자로 자동 에스컬레이션.
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-remote-spawn
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
description: >
|
|
4
|
+
원격/로컬 머신에 Claude 세션을 psmux 기반으로 spawn하고 관리합니다.
|
|
5
|
+
자동 핸드오프, 추가 프롬프트 전송, 세션 재부착, 원격 환경 자동 감지를 지원합니다.
|
|
6
|
+
이 스킬은 다음 상황에서 반드시 사용하세요:
|
|
7
|
+
원격 실행, 세션 spawn, 다른 머신에서 작업, 원격 Claude, 세션 전달, 핸드오프 전달,
|
|
8
|
+
원격 세션에 프롬프트 보내기, 세션 목록, 세션 재부착.
|
|
9
|
+
로컬 호스트 별칭이 references/hosts.json에 등록되어 있으면 호스트명 언급만으로도 트리거됩니다.
|
|
6
10
|
triggers:
|
|
7
11
|
- tfx-remote-spawn
|
|
8
12
|
- remote-spawn
|
|
9
13
|
argument-hint: "[호스트] [프롬프트] 또는 자연어"
|
|
10
14
|
---
|
|
11
15
|
|
|
12
|
-
# tfx-remote-spawn —
|
|
13
|
-
|
|
14
|
-
> **DEPRECATED:** 이 스킬은 `tfx-swarm`으로 통합되었습니다. `/tfx-swarm`을 사용하세요.
|
|
15
|
-
> 원격 실행, 세션 spawn, 호스트 관리 모두 tfx-swarm에서 처리합니다.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# (레거시) 원격/로컬 Claude 세션 관리
|
|
16
|
+
# tfx-remote-spawn — 원격/로컬 Claude 세션 관리
|
|
20
17
|
|
|
21
18
|
> **ARGUMENTS 처리**: 이 스킬이 `ARGUMENTS: <값>`과 함께 호출되면, 해당 값을 사용자 입력으로 취급하여
|
|
22
19
|
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
@@ -11,10 +11,9 @@ triggers:
|
|
|
11
11
|
argument-hint: "<검색 주제>"
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
#
|
|
14
|
+
# {{SKILL_NAME}} — Light Web Research
|
|
15
15
|
|
|
16
|
-
>
|
|
17
|
-
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
16
|
+
{{> base}}
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
> **Deep 버전**: tfx-deep-research. "제대로/꼼꼼히" 수정자로 자동 에스컬레이션.
|
|
@@ -9,10 +9,9 @@ triggers:
|
|
|
9
9
|
argument-hint: "[파일 경로 또는 변경 설명]"
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# {{SKILL_NAME}} — Light Code Review
|
|
13
13
|
|
|
14
|
-
>
|
|
15
|
-
> 워크플로우의 첫 단계 입력으로 사용한다. ARGUMENTS가 비어있거나 없으면 기존 절차대로 사용자에게 입력을 요청한다.
|
|
14
|
+
{{> base}}
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
> **Deep 버전**: tfx-deep-review. "제대로/꼼꼼히" 수정자로 자동 에스컬레이션.
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tfx-route.sh v2.5 async job system — 통합 테스트
|
|
3
|
+
set -uo pipefail
|
|
4
|
+
|
|
5
|
+
ROUTE="scripts/tfx-route.sh"
|
|
6
|
+
PASS=0
|
|
7
|
+
FAIL=0
|
|
8
|
+
TOTAL=0
|
|
9
|
+
|
|
10
|
+
assert_eq() {
|
|
11
|
+
local name="$1" expected="$2" actual="$3"
|
|
12
|
+
TOTAL=$((TOTAL + 1))
|
|
13
|
+
if [[ "$actual" == *"$expected"* ]]; then
|
|
14
|
+
echo " ✓ $name"
|
|
15
|
+
PASS=$((PASS + 1))
|
|
16
|
+
else
|
|
17
|
+
echo " ✗ $name — expected: '$expected', got: '$actual'"
|
|
18
|
+
FAIL=$((FAIL + 1))
|
|
19
|
+
fi
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
assert_neq() {
|
|
23
|
+
local name="$1" unexpected="$2" actual="$3"
|
|
24
|
+
TOTAL=$((TOTAL + 1))
|
|
25
|
+
if [[ "$actual" != *"$unexpected"* ]]; then
|
|
26
|
+
echo " ✓ $name"
|
|
27
|
+
PASS=$((PASS + 1))
|
|
28
|
+
else
|
|
29
|
+
echo " ✗ $name — should NOT contain: '$unexpected', got: '$actual'"
|
|
30
|
+
FAIL=$((FAIL + 1))
|
|
31
|
+
fi
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
assert_exit() {
|
|
35
|
+
local name="$1" expected="$2" actual="$3"
|
|
36
|
+
TOTAL=$((TOTAL + 1))
|
|
37
|
+
if [[ "$actual" -eq "$expected" ]]; then
|
|
38
|
+
echo " ✓ $name"
|
|
39
|
+
PASS=$((PASS + 1))
|
|
40
|
+
else
|
|
41
|
+
echo " ✗ $name — expected exit=$expected, got exit=$actual"
|
|
42
|
+
FAIL=$((FAIL + 1))
|
|
43
|
+
fi
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
echo "═══ tfx-route.sh v2.5 Async Job System Tests ═══"
|
|
47
|
+
echo ""
|
|
48
|
+
|
|
49
|
+
# ── Test 1: --async 기본 동작 ──
|
|
50
|
+
echo "Test 1: --async 기본 시작 + job_id 반환"
|
|
51
|
+
JOB_ID=$(bash "$ROUTE" --async executor "echo hello" none 30 2>/dev/null)
|
|
52
|
+
EC=$?
|
|
53
|
+
assert_exit "exit code 0" 0 "$EC"
|
|
54
|
+
TOTAL=$((TOTAL + 1))
|
|
55
|
+
if [[ -n "$JOB_ID" ]]; then echo " ✓ job_id not empty ($JOB_ID)"; PASS=$((PASS + 1)); else echo " ✗ job_id is empty"; FAIL=$((FAIL + 1)); fi
|
|
56
|
+
assert_neq "job_id not error" "error" "$JOB_ID"
|
|
57
|
+
echo ""
|
|
58
|
+
|
|
59
|
+
# ── Test 2: --job-status running → done 전이 ──
|
|
60
|
+
echo "Test 2: --job-status 상태 전이 (running → done)"
|
|
61
|
+
LONG_JOB=$(bash "$ROUTE" --async executor "sleep 3 && echo done" none 60 2>/dev/null)
|
|
62
|
+
STATUS_EARLY=$(bash "$ROUTE" --job-status "$LONG_JOB" 2>/dev/null)
|
|
63
|
+
assert_eq "initial status: running" "running" "$STATUS_EARLY"
|
|
64
|
+
|
|
65
|
+
# Codex 시작 ~10초 + sleep 3초 + 후처리 → 최대 25초 대기
|
|
66
|
+
for i in $(seq 1 5); do
|
|
67
|
+
sleep 5
|
|
68
|
+
STATUS_LATE=$(bash "$ROUTE" --job-status "$LONG_JOB" 2>/dev/null)
|
|
69
|
+
[[ "$STATUS_LATE" == "done" ]] && break
|
|
70
|
+
done
|
|
71
|
+
assert_eq "final status: done" "done" "$STATUS_LATE"
|
|
72
|
+
echo ""
|
|
73
|
+
|
|
74
|
+
# ── Test 3: --job-status 존재하지 않는 job ──
|
|
75
|
+
echo "Test 3: --job-status 존재하지 않는 job"
|
|
76
|
+
RESULT=$(bash "$ROUTE" --job-status "nonexistent-12345" 2>/dev/null)
|
|
77
|
+
EC=$?
|
|
78
|
+
assert_eq "returns error" "error" "$RESULT"
|
|
79
|
+
assert_exit "exit code 1" 1 "$EC"
|
|
80
|
+
echo ""
|
|
81
|
+
|
|
82
|
+
# ── Test 4: --job-result 완료된 job ──
|
|
83
|
+
echo "Test 4: --job-result 완료된 job 결과 읽기"
|
|
84
|
+
# Test 1의 JOB_ID 재사용 — Codex 완료 대기
|
|
85
|
+
for i in $(seq 1 6); do
|
|
86
|
+
S=$(bash "$ROUTE" --job-status "$JOB_ID" 2>/dev/null)
|
|
87
|
+
[[ "$S" == "done" ]] && break
|
|
88
|
+
sleep 5
|
|
89
|
+
done
|
|
90
|
+
RESULT=$(bash "$ROUTE" --job-result "$JOB_ID" 2>/dev/null)
|
|
91
|
+
EC=$?
|
|
92
|
+
assert_exit "exit code 0" 0 "$EC"
|
|
93
|
+
TOTAL=$((TOTAL + 1))
|
|
94
|
+
if [[ -n "$RESULT" ]]; then echo " ✓ result not empty (${#RESULT} bytes)"; PASS=$((PASS + 1)); else echo " ✗ result is empty"; FAIL=$((FAIL + 1)); fi
|
|
95
|
+
assert_neq "result not error" "error:" "$RESULT"
|
|
96
|
+
echo ""
|
|
97
|
+
|
|
98
|
+
# ── Test 5: --job-result 아직 실행 중인 job ──
|
|
99
|
+
echo "Test 5: --job-result 실행 중인 job → 에러"
|
|
100
|
+
RUNNING_JOB=$(bash "$ROUTE" --async executor "sleep 30" none 60 2>/dev/null)
|
|
101
|
+
RESULT=$(bash "$ROUTE" --job-result "$RUNNING_JOB" 2>/dev/null)
|
|
102
|
+
EC=$?
|
|
103
|
+
assert_eq "returns error" "error: job still running" "$RESULT"
|
|
104
|
+
assert_exit "exit code 1" 1 "$EC"
|
|
105
|
+
# cleanup
|
|
106
|
+
JOB_DIR="${TMPDIR:-/tmp}/tfx-jobs/$RUNNING_JOB"
|
|
107
|
+
[[ -f "$JOB_DIR/pid" ]] && kill "$(cat "$JOB_DIR/pid")" 2>/dev/null
|
|
108
|
+
echo ""
|
|
109
|
+
|
|
110
|
+
# ── Test 6: --job-wait 완료 감지 ──
|
|
111
|
+
echo "Test 6: --job-wait 완료 감지"
|
|
112
|
+
WAIT_JOB=$(bash "$ROUTE" --async executor "echo wait-test-ok" none 30 2>/dev/null)
|
|
113
|
+
sleep 15 # codex 실행 대기
|
|
114
|
+
WAIT_RESULT=$(bash "$ROUTE" --job-wait "$WAIT_JOB" 60 2>/dev/null)
|
|
115
|
+
assert_eq "wait returns done" "done" "$WAIT_RESULT"
|
|
116
|
+
echo ""
|
|
117
|
+
|
|
118
|
+
# ── Test 7: --job-wait still_running (max_wait < 실행시간) ──
|
|
119
|
+
echo "Test 7: --job-wait still_running (짧은 max_wait)"
|
|
120
|
+
SLOW_JOB=$(bash "$ROUTE" --async executor "sleep 60" none 120 2>/dev/null)
|
|
121
|
+
sleep 1
|
|
122
|
+
WAIT_RESULT=$(bash "$ROUTE" --job-wait "$SLOW_JOB" 5 2>/dev/null)
|
|
123
|
+
assert_eq "wait returns still_running" "still_running" "$WAIT_RESULT"
|
|
124
|
+
# cleanup
|
|
125
|
+
JOB_DIR="${TMPDIR:-/tmp}/tfx-jobs/$SLOW_JOB"
|
|
126
|
+
[[ -f "$JOB_DIR/pid" ]] && kill "$(cat "$JOB_DIR/pid")" 2>/dev/null
|
|
127
|
+
echo ""
|
|
128
|
+
|
|
129
|
+
# ── Test 8: exit code 전파 ──
|
|
130
|
+
echo "Test 8: 실패한 job의 exit code 전파"
|
|
131
|
+
FAIL_JOB=$(bash "$ROUTE" --async executor "exit 42" none 30 2>/dev/null)
|
|
132
|
+
# Codex 완료 대기
|
|
133
|
+
for i in $(seq 1 8); do
|
|
134
|
+
S=$(bash "$ROUTE" --job-status "$FAIL_JOB" 2>/dev/null)
|
|
135
|
+
[[ "$S" != *"running"* ]] && break
|
|
136
|
+
sleep 5
|
|
137
|
+
done
|
|
138
|
+
STATUS=$(bash "$ROUTE" --job-status "$FAIL_JOB" 2>/dev/null)
|
|
139
|
+
# Codex가 exit 42를 감싸서 성공/실패 둘 다 가능 — "running이 아님"만 확인
|
|
140
|
+
TOTAL=$((TOTAL + 1))
|
|
141
|
+
if [[ "$STATUS" == "done" || "$STATUS" == *"failed"* || "$STATUS" == "timeout" ]]; then
|
|
142
|
+
echo " ✓ status is terminal: $STATUS"; PASS=$((PASS + 1))
|
|
143
|
+
else
|
|
144
|
+
echo " ✗ status not terminal: $STATUS"; FAIL=$((FAIL + 1))
|
|
145
|
+
fi
|
|
146
|
+
# Codex는 exit 42를 감싸서 다른 코드로 반환할 수 있음 — 완료 자체만 확인
|
|
147
|
+
TOTAL=$((TOTAL + 1))
|
|
148
|
+
if [[ "$STATUS" != *"running"* ]]; then echo " ✓ job completed (not stuck running)"; PASS=$((PASS + 1)); else echo " ✗ job still running"; FAIL=$((FAIL + 1)); fi
|
|
149
|
+
echo ""
|
|
150
|
+
|
|
151
|
+
# ── Test 9: job 디렉토리 구조 검증 ──
|
|
152
|
+
echo "Test 9: job 디렉토리 구조"
|
|
153
|
+
STRUCT_JOB=$(bash "$ROUTE" --async executor "echo structure-test" none 30 2>/dev/null)
|
|
154
|
+
JOB_DIR="${TMPDIR:-/tmp}/tfx-jobs/$STRUCT_JOB"
|
|
155
|
+
assert_eq "pid file exists" "true" "$([ -f "$JOB_DIR/pid" ] && echo true || echo false)"
|
|
156
|
+
assert_eq "agent_type file exists" "true" "$([ -f "$JOB_DIR/agent_type" ] && echo true || echo false)"
|
|
157
|
+
assert_eq "start_time file exists" "true" "$([ -f "$JOB_DIR/start_time" ] && echo true || echo false)"
|
|
158
|
+
AGENT=$(cat "$JOB_DIR/agent_type" 2>/dev/null)
|
|
159
|
+
assert_eq "agent_type == executor" "executor" "$AGENT"
|
|
160
|
+
echo ""
|
|
161
|
+
|
|
162
|
+
# ── Test 10: native.mjs 프롬프트 검증 ──
|
|
163
|
+
echo "Test 10: native.mjs buildSlimWrapperPrompt async 키워드"
|
|
164
|
+
PROMPT_CHECK=$(node -e "
|
|
165
|
+
import('./hub/team/native.mjs').then(m => {
|
|
166
|
+
const p = m.buildSlimWrapperPrompt('codex', {
|
|
167
|
+
subtask: 'test task',
|
|
168
|
+
role: 'scientist',
|
|
169
|
+
teamName: 'test-team',
|
|
170
|
+
taskId: 'task-1',
|
|
171
|
+
agentName: 'codex-worker-1',
|
|
172
|
+
});
|
|
173
|
+
const checks = {
|
|
174
|
+
has_async: p.includes('--async'),
|
|
175
|
+
has_job_wait: p.includes('--job-wait'),
|
|
176
|
+
has_job_result: p.includes('--job-result'),
|
|
177
|
+
has_route_timeout: p.includes('auto 1800'),
|
|
178
|
+
no_old_bashTimeout: !p.includes('timeout: 1860000'),
|
|
179
|
+
has_launch_timeout: p.includes('timeout: 15000'),
|
|
180
|
+
has_wait_timeout: p.includes('timeout: 570000'),
|
|
181
|
+
has_result_timeout: p.includes('timeout: 30000'),
|
|
182
|
+
};
|
|
183
|
+
for (const [k, v] of Object.entries(checks)) {
|
|
184
|
+
console.log(k + '=' + v);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
" 2>/dev/null)
|
|
188
|
+
for line in $PROMPT_CHECK; do
|
|
189
|
+
key="${line%%=*}"
|
|
190
|
+
val="${line##*=}"
|
|
191
|
+
assert_eq "$key" "true" "$val"
|
|
192
|
+
done
|
|
193
|
+
echo ""
|
|
194
|
+
|
|
195
|
+
# ── 결과 요약 ──
|
|
196
|
+
echo "═══════════════════════════════════════════════════"
|
|
197
|
+
echo " Results: $PASS/$TOTAL passed, $FAIL failed"
|
|
198
|
+
echo "═══════════════════════════════════════════════════"
|
|
199
|
+
|
|
200
|
+
if [[ "$FAIL" -gt 0 ]]; then
|
|
201
|
+
exit 1
|
|
202
|
+
fi
|
|
203
|
+
exit 0
|