Skip to content

Commit 0337c1d

Browse files
committed
Merge remote-tracking branch 'origin/main' into feat/hook-session-memory-redirect
# Conflicts: # src/hooks/bundled/session-memory/handler.ts
2 parents b6f8243 + b317747 commit 0337c1d

317 files changed

Lines changed: 13535 additions & 2579 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/crabbox/SKILL.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,18 @@ It should include `broker.url`, `broker.token`, and usually `provider: aws`
266266
for owned-cloud lanes. Do not let that config override the OpenClaw default
267267
when Blacksmith proof is requested; pass `--provider blacksmith-testbox`.
268268

269+
### Interactive Desktop / WebVNC
270+
271+
For human WebVNC demos, keep the remote desktop visible and windowed. Do not
272+
fullscreen the remote browser or hide the XFCE panel/window chrome unless the
273+
explicit goal is video/capture output. After launch, verify a screenshot shows
274+
the desktop panel plus browser title bar. If Chrome is fullscreen, toggle it
275+
back with:
276+
277+
```sh
278+
crabbox run --id <lease> --shell -- 'DISPLAY=:99 xdotool search --onlyvisible --class google-chrome windowactivate key F11'
279+
```
280+
269281
## Diagnostics
270282

271283
```sh

.agents/skills/openclaw-pr-maintainer/SKILL.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,60 @@ gitcrawl search openclaw/openclaw --query "<scope or title keywords>" --mode hyb
2424
gitcrawl cluster-detail openclaw/openclaw --id <cluster-id> --member-limit 20 --body-chars 280 --json
2525
```
2626

27+
## Surface opener identity
28+
29+
- For every reviewed, triaged, closed, or landed issue/PR, show the opener's human name when available, GitHub login, and account age.
30+
- Get the login from `gh issue view` / `gh pr view` (`author.login`), then fetch profile metadata once with `gh api users/<login> --jq '{login,name,created_at,type}'`.
31+
- Report account age as created date plus rough age, for example `Opened by Jane Doe (@jane, account created 2021-04-03, ~5y old)`.
32+
- Also show recent GitHub activity when it informs maintainer risk: OpenClaw PRs, issues, and commits in the last 12 months; for linked issue-fixing PRs, include both the PR author and issue opener when they differ.
33+
- Prefer the bundled helper for activity lookups:
34+
35+
```bash
36+
.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh <login> [other-login...]
37+
.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh --global <login>
38+
```
39+
40+
- The helper reports repo-local activity first and can fetch public GitHub contribution totals for the same window with `--global`.
41+
- The helper is intentionally cache-friendly for gitcrawl-backed `gh`: it rounds repo-local windows to the UTC day, rounds global contribution windows to the UTC hour, and counts PRs/issues from one paginated issues response before fetching commits separately. Prefer reusing the helper instead of hand-rolling several `gh api` loops.
42+
- Report activity compactly, for example `OpenClaw last 12mo: 4 PRs, 2 issues, 11 commits; GitHub public last 12mo: 86 commits, 9 PRs, 3 issues, 12 reviews`.
43+
- If `name` is empty, use the login only. If profile lookup is rate-limited or unavailable, say `account age unknown` rather than omitting the opener.
44+
- Use identity and activity as triage signal, not proof by itself: new, low-activity, or bot-like accounts can raise review caution, but code, repro, and CI evidence still decide.
45+
46+
## Suppress top-maintainer items in issue triage
47+
48+
When Peter asks for issue triage, hot issues, pressing bugs, Discord-correlated issues, or "what is still open", do not surface issues or PRs authored by top maintainers by default. He wants external/user-reported hot issues and external PRs, not maintainer-owned work queues.
49+
50+
Suppress by default when the opener/author is one of:
51+
52+
- `@vincentkoc`
53+
- `@Takhoffman`
54+
- `@gumadeiras`
55+
- `@obviyus`
56+
- `@shakkernerd`
57+
- `@mbelinky`
58+
- `@joshavant`
59+
- `@ngutman`
60+
- `@vignesh07`
61+
- `@huntharo`
62+
63+
Also suppress lower-priority maintainer-owned noise from the broader keep/top-maintainer group unless it is directly relevant:
64+
65+
- `@thewilloftheshadow`
66+
- `@onutc` / `@osolmaz`
67+
- `@jacobtomlinson`
68+
- `@tyler6204`
69+
- `@velvet-shark`
70+
- `@jalehman`
71+
- `@frankekn`
72+
- `@ImLukeF`
73+
- `@mcaxtr`
74+
75+
Exceptions:
76+
77+
- Show maintainer-authored items when Peter explicitly asks for maintainer PRs/issues, PR landing candidates, release-blocking maintainer work, or a specific PR/issue number.
78+
- Show a maintainer-authored item when it is the canonical fix for an external hot issue, but frame it as the fix path rather than as a user-facing issue candidate.
79+
- Do not close, label, or deprioritize solely because an item is maintainer-authored; this section only controls what appears in triage shortlists.
80+
2781
## Apply close and triage labels correctly
2882

2983
- If an issue or PR matches an auto-close reason, apply the label and let `.github/workflows/auto-response.yml` handle the comment/close/lock flow.
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
repo="openclaw/openclaw"
5+
months="12"
6+
include_global="0"
7+
8+
usage() {
9+
printf 'Usage: %s [--repo owner/repo] [--months N] [--global] <github-login> [login...]\n' "$0"
10+
}
11+
12+
die() {
13+
printf 'error: %s\n' "$*" >&2
14+
exit 1
15+
}
16+
17+
need() {
18+
command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
19+
}
20+
21+
date_utc_relative_months() {
22+
local count="$1"
23+
if date -u -v-"${count}"m +%Y-%m-%dT00:00:00Z >/dev/null 2>&1; then
24+
date -u -v-"${count}"m +%Y-%m-%dT00:00:00Z
25+
return
26+
fi
27+
date -u -d "${count} months ago" +%Y-%m-%dT00:00:00Z
28+
}
29+
30+
date_to_epoch() {
31+
local value="$1"
32+
if date -u -j -f '%Y-%m-%dT%H:%M:%SZ' "$value" +%s >/dev/null 2>&1; then
33+
date -u -j -f '%Y-%m-%dT%H:%M:%SZ' "$value" +%s
34+
return
35+
fi
36+
date -u -d "$value" +%s
37+
}
38+
39+
rough_age() {
40+
local created_at="$1"
41+
local now_s created_s days
42+
now_s=$(date -u +%s)
43+
created_s=$(date_to_epoch "$created_at")
44+
days=$(( (now_s - created_s) / 86400 ))
45+
if (( days < 120 )); then
46+
printf '~%dd old' "$days"
47+
return
48+
fi
49+
awk -v days="$days" 'BEGIN { printf "~%.1fy old", days / 365.2425 }'
50+
}
51+
52+
thread_kinds() {
53+
local login="$1"
54+
local since_ts="$2"
55+
gh api --paginate "repos/${repo}/issues?state=all&creator=${login}&since=${since_ts}&per_page=100" \
56+
--jq ".[] | select(.created_at >= \"${since_ts}\") | if has(\"pull_request\") then \"pr\" else \"issue\" end"
57+
}
58+
59+
count_kind_lines() {
60+
local kind="$1"
61+
local lines="$2"
62+
grep -cx "$kind" <<<"$lines" 2>/dev/null || true
63+
}
64+
65+
count_commits() {
66+
local login="$1"
67+
local since_ts="$2"
68+
gh api --paginate "repos/${repo}/commits?author=${login}&since=${since_ts}&per_page=100" \
69+
--jq '.[].sha' | wc -l | tr -d '[:space:]'
70+
}
71+
72+
global_activity() {
73+
local login="$1"
74+
local since_ts="$2"
75+
local now_ts="$3"
76+
# shellcheck disable=SC2016
77+
gh api graphql \
78+
-f login="$login" \
79+
-f from="$since_ts" \
80+
-f to="$now_ts" \
81+
-f query='
82+
query($login: String!, $from: DateTime!, $to: DateTime!) {
83+
user(login: $login) {
84+
contributionsCollection(from: $from, to: $to) {
85+
totalCommitContributions
86+
totalIssueContributions
87+
totalPullRequestContributions
88+
totalPullRequestReviewContributions
89+
}
90+
}
91+
}' \
92+
--jq '.data.user.contributionsCollection // empty'
93+
}
94+
95+
while [[ $# -gt 0 ]]; do
96+
case "$1" in
97+
--repo)
98+
[[ $# -ge 2 ]] || die "--repo requires owner/repo"
99+
repo="$2"
100+
shift 2
101+
;;
102+
--months)
103+
[[ $# -ge 2 ]] || die "--months requires a positive integer"
104+
months="$2"
105+
[[ "$months" =~ ^[0-9]+$ && "$months" != "0" ]] || die "--months must be a positive integer"
106+
shift 2
107+
;;
108+
--global)
109+
include_global="1"
110+
shift
111+
;;
112+
-h|--help)
113+
usage
114+
exit 0
115+
;;
116+
--)
117+
shift
118+
break
119+
;;
120+
-*)
121+
die "unknown option: $1"
122+
;;
123+
*)
124+
break
125+
;;
126+
esac
127+
done
128+
129+
[[ $# -gt 0 ]] || {
130+
usage >&2
131+
exit 2
132+
}
133+
134+
need gh
135+
need jq
136+
137+
since_ts=$(date_utc_relative_months "$months")
138+
now_ts=$(date -u +%Y-%m-%dT%H:00:00Z)
139+
140+
for login in "$@"; do
141+
profile=$(gh api "users/${login}" --jq '{login,name,created_at,type}')
142+
display_login=$(jq -r '.login' <<<"$profile")
143+
name=$(jq -r '.name // empty' <<<"$profile")
144+
created_at=$(jq -r '.created_at' <<<"$profile")
145+
type=$(jq -r '.type' <<<"$profile")
146+
created_day=${created_at%%T*}
147+
148+
kinds=$(thread_kinds "$display_login" "$since_ts")
149+
prs=$(count_kind_lines pr "$kinds")
150+
issues=$(count_kind_lines issue "$kinds")
151+
commits=$(count_commits "$display_login" "$since_ts")
152+
153+
if [[ -n "$name" ]]; then
154+
printf '%s (@%s, %s, account created %s, %s)\n' \
155+
"$name" "$display_login" "$type" "$created_day" "$(rough_age "$created_at")"
156+
else
157+
printf '@%s (%s, account created %s, %s)\n' \
158+
"$display_login" "$type" "$created_day" "$(rough_age "$created_at")"
159+
fi
160+
printf '%s last %smo: %s PRs, %s issues, %s commits\n' "$repo" "$months" "$prs" "$issues" "$commits"
161+
162+
if [[ "$include_global" == "1" ]]; then
163+
if global_json=$(global_activity "$display_login" "$since_ts" "$now_ts" 2>/dev/null); then
164+
if [[ -n "$global_json" ]]; then
165+
global_commits=$(jq -r '.totalCommitContributions' <<<"$global_json")
166+
global_issues=$(jq -r '.totalIssueContributions' <<<"$global_json")
167+
global_prs=$(jq -r '.totalPullRequestContributions' <<<"$global_json")
168+
global_reviews=$(jq -r '.totalPullRequestReviewContributions' <<<"$global_json")
169+
printf 'GitHub public last %smo: %s commits, %s PRs, %s issues, %s reviews\n' \
170+
"$months" "$global_commits" "$global_prs" "$global_issues" "$global_reviews"
171+
else
172+
printf 'GitHub public last %smo: unavailable\n' "$months"
173+
fi
174+
else
175+
printf 'GitHub public last %smo: unavailable\n' "$months"
176+
fi
177+
fi
178+
done

.github/pull_request_template.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ If this PR fixes a plugin beta-release blocker, title it `fix(<plugin-id>): beta
3535
- Related #
3636
- [ ] This PR fixes a bug or regression
3737

38+
## Real behavior proof (required for external PRs)
39+
40+
External contributors must show after-fix evidence from a real OpenClaw setup. Unit tests, mocks, lint, typechecks, snapshots, and CI are supplemental only. Screenshots are encouraged even for CLI, console, text, or log changes; terminal screenshots and copied live output count.
41+
42+
- Behavior or issue addressed:
43+
- Real environment tested:
44+
- Exact steps or command run after this patch:
45+
- Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):
46+
- Observed result after fix:
47+
- What was not tested:
48+
- Before evidence (optional but encouraged):
49+
3850
## Root Cause (if applicable)
3951

4052
For bug fixes or regressions, explain why this happened, not just what changed. Otherwise write `N/A`. If the cause is unclear, write `Unknown`.

.github/workflows/auto-response.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
issue_comment:
77
types: [created]
88
pull_request_target: # zizmor: ignore[dangerous-triggers] maintainer-owned label automation; trusted base checkout only, no untrusted PR code execution
9-
types: [opened, edited, synchronize, reopened, labeled]
9+
types: [opened, edited, synchronize, reopened, labeled, unlabeled]
1010

1111
env:
1212
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

0 commit comments

Comments
 (0)