Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11), free to diverge. Tree copied sans upstream .git; upstream remote added for future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19. Preserves docs/ARCHITECTURE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
192 lines
5.1 KiB
Bash
Executable File
192 lines
5.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
repo="openclaw/openclaw"
|
|
months="12"
|
|
include_global="0"
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
repo_root="$(git -C "$script_dir/../../../.." rev-parse --show-toplevel 2>/dev/null || true)"
|
|
if [ -z "$repo_root" ]; then
|
|
repo_root="$(cd "$script_dir/../../../.." && pwd)"
|
|
fi
|
|
|
|
# shellcheck disable=SC1091
|
|
source "$repo_root/scripts/lib/plain-gh.sh"
|
|
|
|
usage() {
|
|
printf 'Usage: %s [--repo owner/repo] [--months N] [--global] <github-login> [login...]\n' "$0"
|
|
}
|
|
|
|
die() {
|
|
printf 'error: %s\n' "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
need() {
|
|
command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
|
|
}
|
|
|
|
gh() {
|
|
gh_plain "$@"
|
|
}
|
|
|
|
date_utc_relative_months() {
|
|
local count="$1"
|
|
if date -u -v-"${count}"m +%Y-%m-%dT00:00:00Z >/dev/null 2>&1; then
|
|
date -u -v-"${count}"m +%Y-%m-%dT00:00:00Z
|
|
return
|
|
fi
|
|
date -u -d "${count} months ago" +%Y-%m-%dT00:00:00Z
|
|
}
|
|
|
|
date_to_epoch() {
|
|
local value="$1"
|
|
if date -u -j -f '%Y-%m-%dT%H:%M:%SZ' "$value" +%s >/dev/null 2>&1; then
|
|
date -u -j -f '%Y-%m-%dT%H:%M:%SZ' "$value" +%s
|
|
return
|
|
fi
|
|
date -u -d "$value" +%s
|
|
}
|
|
|
|
rough_age() {
|
|
local created_at="$1"
|
|
local now_s created_s days
|
|
now_s=$(date -u +%s)
|
|
created_s=$(date_to_epoch "$created_at")
|
|
days=$(( (now_s - created_s) / 86400 ))
|
|
if (( days < 120 )); then
|
|
printf '~%dd old' "$days"
|
|
return
|
|
fi
|
|
awk -v days="$days" 'BEGIN { printf "~%.1fy old", days / 365.2425 }'
|
|
}
|
|
|
|
thread_kinds() {
|
|
local login="$1"
|
|
local since_ts="$2"
|
|
gh api --paginate "repos/${repo}/issues?state=all&creator=${login}&since=${since_ts}&per_page=100" \
|
|
--jq ".[] | select(.created_at >= \"${since_ts}\") | if has(\"pull_request\") then \"pr\" else \"issue\" end"
|
|
}
|
|
|
|
count_kind_lines() {
|
|
local kind="$1"
|
|
local lines="$2"
|
|
grep -cx "$kind" <<<"$lines" 2>/dev/null || true
|
|
}
|
|
|
|
count_commits() {
|
|
local login="$1"
|
|
local since_ts="$2"
|
|
gh api --paginate "repos/${repo}/commits?author=${login}&since=${since_ts}&per_page=100" \
|
|
--jq '.[].sha' | wc -l | tr -d '[:space:]'
|
|
}
|
|
|
|
global_activity() {
|
|
local login="$1"
|
|
local since_ts="$2"
|
|
local now_ts="$3"
|
|
# shellcheck disable=SC2016
|
|
gh api graphql \
|
|
-f login="$login" \
|
|
-f from="$since_ts" \
|
|
-f to="$now_ts" \
|
|
-f query='
|
|
query($login: String!, $from: DateTime!, $to: DateTime!) {
|
|
user(login: $login) {
|
|
contributionsCollection(from: $from, to: $to) {
|
|
totalCommitContributions
|
|
totalIssueContributions
|
|
totalPullRequestContributions
|
|
totalPullRequestReviewContributions
|
|
}
|
|
}
|
|
}' \
|
|
--jq '.data.user.contributionsCollection // empty'
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--repo)
|
|
[[ $# -ge 2 ]] || die "--repo requires owner/repo"
|
|
repo="$2"
|
|
shift 2
|
|
;;
|
|
--months)
|
|
[[ $# -ge 2 ]] || die "--months requires a positive integer"
|
|
months="$2"
|
|
[[ "$months" =~ ^[0-9]+$ && "$months" != "0" ]] || die "--months must be a positive integer"
|
|
shift 2
|
|
;;
|
|
--global)
|
|
include_global="1"
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
-*)
|
|
die "unknown option: $1"
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[[ $# -gt 0 ]] || {
|
|
usage >&2
|
|
exit 2
|
|
}
|
|
|
|
OPENCLAW_GH_BIN="$(resolve_plain_gh_bin)" || die "missing required command: gh"
|
|
export OPENCLAW_GH_BIN
|
|
need jq
|
|
|
|
since_ts=$(date_utc_relative_months "$months")
|
|
now_ts=$(date -u +%Y-%m-%dT%H:00:00Z)
|
|
|
|
for login in "$@"; do
|
|
profile=$(gh api "users/${login}" --jq '{login,name,created_at,type}')
|
|
display_login=$(jq -r '.login' <<<"$profile")
|
|
name=$(jq -r '.name // empty' <<<"$profile")
|
|
created_at=$(jq -r '.created_at' <<<"$profile")
|
|
type=$(jq -r '.type' <<<"$profile")
|
|
created_day=${created_at%%T*}
|
|
|
|
kinds=$(thread_kinds "$display_login" "$since_ts")
|
|
prs=$(count_kind_lines pr "$kinds")
|
|
issues=$(count_kind_lines issue "$kinds")
|
|
commits=$(count_commits "$display_login" "$since_ts")
|
|
|
|
if [[ -n "$name" ]]; then
|
|
printf '%s (@%s, %s, account created %s, %s)\n' \
|
|
"$name" "$display_login" "$type" "$created_day" "$(rough_age "$created_at")"
|
|
else
|
|
printf '@%s (%s, account created %s, %s)\n' \
|
|
"$display_login" "$type" "$created_day" "$(rough_age "$created_at")"
|
|
fi
|
|
printf '%s last %smo: %s PRs, %s issues, %s commits\n' "$repo" "$months" "$prs" "$issues" "$commits"
|
|
|
|
if [[ "$include_global" == "1" ]]; then
|
|
if global_json=$(global_activity "$display_login" "$since_ts" "$now_ts" 2>/dev/null); then
|
|
if [[ -n "$global_json" ]]; then
|
|
global_commits=$(jq -r '.totalCommitContributions' <<<"$global_json")
|
|
global_issues=$(jq -r '.totalIssueContributions' <<<"$global_json")
|
|
global_prs=$(jq -r '.totalPullRequestContributions' <<<"$global_json")
|
|
global_reviews=$(jq -r '.totalPullRequestReviewContributions' <<<"$global_json")
|
|
printf 'GitHub public last %smo: %s commits, %s PRs, %s issues, %s reviews\n' \
|
|
"$months" "$global_commits" "$global_prs" "$global_issues" "$global_reviews"
|
|
else
|
|
printf 'GitHub public last %smo: unavailable\n' "$months"
|
|
fi
|
|
else
|
|
printf 'GitHub public last %smo: unavailable\n' "$months"
|
|
fi
|
|
fi
|
|
done
|