Files
hakorune/tools/codex-keep-two.sh
Moe Charm 19f775c34d feat(phase12.7): 糖衣構文Phase 12.7-B完了 + 自律型AI開発システム制御機能
🚀 Phase 12.7-B: ChatGPT5糖衣構文(基本実装完了)
- パイプライン演算子(|>)実装
- セーフアクセス(?.)とデフォルト値(??)実装
- sugar gateによる段階的有効化機能
- 糖衣構文テストスイート追加

🤖 自律型AI開発システム改善
- codex-async-notify.sh: タスク制御指示追加
  - "下の箱を積み過ぎないように先に進んでください"
  - "フェーズが終わったと判断したら止まってください"
- プロセス数表示機能の改善(count_running_codex_display)
- 自動停止機能が正常動作(Phase 12.7-C前で停止確認)

📚 ドキュメント更新
- Paper 13: 自律型AI協調開発システムの革新性を文書化
- ANCP可逆マッピング仕様追加
- nyfmt PoC(フォーマッター)計画追加

🧱 箱理論の体現
- 74k行のコードベース(Phase 15で20k行を目指す)
- ANCP適用で最終的に6k行相当を狙う
- 世界最小の実用コンパイラへの道

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 05:16:21 +09:00

101 lines
2.9 KiB
Bash

#!/bin/bash
# Keep two codex exec jobs running by topping up when fewer are active.
# Usage:
# tools/codex-keep-two.sh <tmux_session> "Task A" "Task B" ["Task C" ...]
# Notes:
# - Detects only real `codex exec` processes via ps/awk (avoids self-matches).
# - Starts tasks in order, cycling if more top-ups are needed.
set -euo pipefail
if [ $# -lt 2 ]; then
echo "Usage: $0 <tmux_session> \"Task A\" \"Task B\" [\"Task C\" ...]" >&2
exit 1
fi
SESSION="$1"; shift
TASKS=("$@")
if [ ${#TASKS[@]} -eq 0 ]; then
echo "Provide at least one task string." >&2
exit 1
fi
CODEX_PROC_PATTERN=${CODEX_PROC_PATTERN:-'codex .* exec'}
CODEX_COUNT_MODE=${CODEX_COUNT_MODE:-sentinel}
WORK_DIR="$HOME/.codex-async-work"
RUN_DIR="$WORK_DIR/running"
list_running() {
if command -v pgrep >/dev/null 2>&1; then
pgrep -af -- "$CODEX_PROC_PATTERN" | grep -v 'pgrep' || true
else
ps -eo pid=,args= | grep -E -- "$CODEX_PROC_PATTERN" | grep -v grep || true
fi
}
count_running() {
case "$CODEX_COUNT_MODE" in
sentinel)
local cnt=0
if [ -d "$RUN_DIR" ]; then
for f in "$RUN_DIR"/codex-*.run; do
[ -e "$f" ] || continue
pid=$(awk -F': ' '/^pid:/{print $2; exit}' "$f" 2>/dev/null || true)
if [ -n "$pid" ] && ! kill -0 "$pid" 2>/dev/null; then
rm -f "$f" 2>/dev/null || true
continue
fi
cnt=$((cnt+1))
done
fi
if [ "${cnt:-0}" -eq 0 ]; then
if command -v pgrep >/dev/null 2>&1; then
pgrep -f -- "$CODEX_PROC_PATTERN" \
| xargs -r -I {} sh -c 'ps -o pgid= -p "$1" 2>/dev/null' _ {} \
| awk '{print $1}' | grep -E '^[0-9]+$' | sort -u | wc -l | tr -d ' ' || echo 0
else
list_running | wc -l | tr -d ' ' || echo 0
fi
else
echo "$cnt"
fi
;;
pgid)
if command -v pgrep >/dev/null 2>&1; then
pgrep -f -- "$CODEX_PROC_PATTERN" \
| xargs -r -I {} sh -c 'ps -o pgid= -p "$1" 2>/dev/null' _ {} \
| awk '{print $1}' | grep -E '^[0-9]+$' | sort -u | wc -l | tr -d ' ' || echo 0
else
list_running | wc -l | tr -d ' ' || echo 0
fi
;;
proc|*)
list_running | wc -l | tr -d ' ' || echo 0
;;
esac
}
RUNNING_RAW=$(count_running)
# Sanitize: take first line, strip spaces, ensure numeric
RUNNING=$(printf "%s" "$RUNNING_RAW" | head -n1 | tr -d '[:space:]')
case "$RUNNING" in
''|*[!0-9]*) RUNNING=0 ;;
esac
echo "[keep-two] 実際のcodexプロセス数: ${RUNNING}"
NEED=$((2 - RUNNING))
if [ $NEED -le 0 ]; then
echo "[keep-two] already running: $RUNNING (>=2)."
exit 0
fi
echo "[keep-two] running=$RUNNING, starting $NEED top-up task(s)."
idx=0
for ((i=0; i<NEED; i++)); do
TASK="${TASKS[$idx]}"; idx=$(((idx+1) % ${#TASKS[@]}))
echo "[keep-two] start: $TASK"
CODEX_ASYNC_DETACH=1 ./tools/codex-async-notify.sh "$TASK" "$SESSION" >/dev/null 2>&1 || true
done
echo "[keep-two] now running: $(count_running)"