#!/usr/bin/env bash
set -euo pipefail
BRANCH="${1:?Usage: dual-dev-metrics.sh <branch> <work-dir> <output-json>}"
WORK_DIR="${2:?Missing work-dir}"
OUTPUT="${3:?Missing output-json}"
echo "=== dual-dev-metrics ==="
echo "branch: $BRANCH"
echo "work-dir: $WORK_DIR"
echo "output: $OUTPUT"
cd "$WORK_DIR"
CURRENT=$(git branch --show-current)
if [ "$CURRENT" != "$BRANCH" ]; then
echo "ERROR: current branch is '$CURRENT', expected '$BRANCH'"
exit 1
fi
BASE_TAG="v0.85.0"
COMMIT_COUNT=$(git log --oneline "${BASE_TAG}..HEAD" | wc -l)
FILES_CHANGED=$(git diff --name-only "${BASE_TAG}..HEAD" | wc -l)
LINES_ADDED=$(git diff --shortstat "${BASE_TAG}..HEAD" | grep -oP '\d+(?= insertion)' || echo 0)
LINES_REMOVED=$(git diff --shortstat "${BASE_TAG}..HEAD" | grep -oP '\d+(?= deletion)' || echo 0)
DIAG_DIR="${WORK_DIR}/.xwcode/diagnostic"
EDIT_FILE_CALLS=0
BASH_WRITE_OPS=0
TASK_COMPLETE_CALLED=false
TOKEN_USAGE=0
ELAPSED_MINUTES=0
if [ -d "$DIAG_DIR" ]; then
COMM_JSONL="${DIAG_DIR}/comm.jsonl"
if [ -f "$COMM_JSONL" ]; then
if grep -q "task_complete" "$COMM_JSONL" 2>/dev/null; then
TASK_COMPLETE_CALLED=true
fi
fi
EVENT_LOG="${DIAG_DIR}/event_log.jsonl"
if [ -f "$EVENT_LOG" ]; then
EDIT_FILE_CALLS=$(grep -c '"edit_file"' "$EVENT_LOG" 2>/dev/null || echo 0)
BASH_WRITE_OPS=$(grep -cE '"(sed.*-i|echo.*>>|awk.*-i inplace|tee|cat\s*>|dd\s+of=)"' "$EVENT_LOG" 2>/dev/null || echo 0)
fi
TURN_SUM="${DIAG_DIR}/turn_summaries.jsonl"
if [ -f "$TURN_SUM" ]; then
TOKEN_USAGE=$(python3 -c "
import json, sys
total = 0
with open('$TURN_SUM') as f:
for line in f:
try:
d = json.loads(line)
total += d.get('total_tokens', 0)
except: pass
print(total)
" 2>/dev/null || echo 0)
fi
fi
CARGO_FMT_PASS=false
CARGO_CLIPPY_PASS=false
CARGO_TEST_PASS=false
if cargo fmt --all --check 2>/dev/null; then
CARGO_FMT_PASS=true
fi
if cargo clippy --all-targets -- -D warnings 2>/dev/null; then
CARGO_CLIPPY_PASS=true
fi
_nt_rc=0
cargo nextest run --workspace -j 32 --no-fail-fast >/dev/null 2>&1 || _nt_rc=$?
case "$_nt_rc" in
0) CARGO_TEST_PASS=true ;;
4) CARGO_TEST_PASS=true
echo "[dual-dev-metrics] ★ nextest rc=4 —— 0 tests(结构性零覆盖 · 非绿非红 · 照实)" >&2 ;;
*) CARGO_TEST_PASS=false ;;
esac
cat > "$OUTPUT" <<EOF
{
"branch": "$BRANCH",
"base_tag": "$BASE_TAG",
"timestamp": "$(date -Iseconds)",
"git": {
"commit_count": $COMMIT_COUNT,
"files_changed": $FILES_CHANGED,
"lines_added": $LINES_ADDED,
"lines_removed": $LINES_REMOVED
},
"process": {
"edit_file_calls": $EDIT_FILE_CALLS,
"bash_write_ops": $BASH_WRITE_OPS,
"task_complete_called": $TASK_COMPLETE_CALLED,
"token_usage": $TOKEN_USAGE,
"elapsed_minutes": $ELAPSED_MINUTES
},
"quality_gates": {
"cargo_fmt_pass": $CARGO_FMT_PASS,
"cargo_clippy_pass": $CARGO_CLIPPY_PASS,
"cargo_test_pass": $CARGO_TEST_PASS
}
}
EOF
echo ""
echo "=== metrics collected ==="
cat "$OUTPUT"