Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
466 commits
Select commit Hold shift + click to select a range
9ff7fe0
docs: standardize compact PR author activity
steipete May 6, 2026
d47c624
docs(release): clarify unpublished beta tag movement
steipete May 6, 2026
a6a4140
fix(media): handle canonical inbound media paths
steipete May 6, 2026
8294229
test: refresh fs-safe boundary expectations
steipete May 6, 2026
b43efd3
fix: clean up post-land CI guards
steipete May 6, 2026
9e108fa
fix: repair fs-safe ci expectations
steipete May 6, 2026
9671a91
docs: Related CardGroups + typography hygiene across 4 pages
vincentkoc May 6, 2026
8b9b849
test: align fs-safe race expectations
steipete May 6, 2026
6ad601d
test: align archive hardlink guard expectation
steipete May 6, 2026
bff5051
docs: drop in-body H1s and typography hygiene across 4 pages
vincentkoc May 6, 2026
ae7c13e
test: restore current-main test isolation
steipete May 6, 2026
36df0d9
fix: repair iOS LAN pairing
BunsDev May 6, 2026
1d1b3a3
test: keep voice-call runtime test on sdk seam
steipete May 6, 2026
b60d5f4
test: keep voice-call runtime tests on public seams
steipete May 6, 2026
585bff4
test: accept archive race refusal variants
steipete May 6, 2026
736f627
docs: typography hygiene across 4 large pages
vincentkoc May 6, 2026
7453226
test: tolerate archive race outcomes
steipete May 6, 2026
b9f7110
docs: typography hygiene + drop one in-body H1 across 5 pages
vincentkoc May 6, 2026
2b8d91d
docs: typography hygiene + 2 in-body H1 removals across 5 pages
vincentkoc May 6, 2026
0bdba47
fix: disable Pi auto-compaction when safeguard mode is active (#73839)
bradhallett May 6, 2026
ea391c6
test: stabilize cron and pairing shard hangs
steipete May 6, 2026
8489d0e
test: update spawn workspace pi settings mock
steipete May 6, 2026
4395f1d
docs: typography hygiene + drop one in-body H1 across 5 pages
vincentkoc May 6, 2026
7a39551
docs: typography hygiene + 2 in-body H1 removals across 5 pages
vincentkoc May 6, 2026
3110c62
fix(gateway): preserve mixed assistant history text
BunsDev May 6, 2026
49c4a13
fix(sessions): restore Control UI /new hooks
BunsDev May 6, 2026
fafd76c
docs: typography hygiene across 5 pages
vincentkoc May 6, 2026
3f6b481
fix: serialize concurrent transcript appends
steipete May 6, 2026
60171e8
Keep Control UI responsive under slow status and history loads
BunsDev May 6, 2026
e2858e7
chore: update channel status protocol models
BunsDev May 6, 2026
c73f774
test: stabilize active-memory timeout partials
steipete May 6, 2026
861a593
docs: typography hygiene across 5 pages
vincentkoc May 6, 2026
8aa377b
fix(control-ui): refine sessions compaction details
BunsDev May 6, 2026
c17121b
test(control-ui): refresh i18n raw copy baseline
BunsDev May 6, 2026
9111f83
chore(ui): refresh pt-BR control ui locale
github-actions[bot] May 6, 2026
47b6515
chore(ui): refresh de control ui locale
github-actions[bot] May 6, 2026
931645e
chore(ui): refresh zh-TW control ui locale
github-actions[bot] May 6, 2026
76e8f59
chore(ui): refresh zh-CN control ui locale
github-actions[bot] May 6, 2026
19071cc
chore(ui): refresh es control ui locale
github-actions[bot] May 6, 2026
3cff0d3
chore(ui): refresh ja-JP control ui locale
github-actions[bot] May 6, 2026
c17bcb9
chore(ui): refresh ko control ui locale
github-actions[bot] May 6, 2026
fc6737b
chore(ui): refresh fr control ui locale
github-actions[bot] May 6, 2026
b9eb969
chore(ui): refresh ar control ui locale
github-actions[bot] May 6, 2026
1a3d775
chore(ui): refresh it control ui locale
github-actions[bot] May 6, 2026
4e867ea
chore(ui): refresh tr control ui locale
github-actions[bot] May 6, 2026
b868f4e
chore(ui): refresh uk control ui locale
github-actions[bot] May 6, 2026
a0a7460
chore(ui): refresh id control ui locale
github-actions[bot] May 6, 2026
9ce00b7
chore(ui): refresh pl control ui locale
github-actions[bot] May 6, 2026
f514368
chore(ui): refresh th control ui locale
github-actions[bot] May 6, 2026
020581a
chore(ui): refresh vi control ui locale
github-actions[bot] May 6, 2026
186d247
chore(ui): refresh fa control ui locale
github-actions[bot] May 6, 2026
d71c119
chore(ui): refresh nl control ui locale
github-actions[bot] May 6, 2026
ae9f779
docs: typography hygiene + 1 in-body H1 removal across 6 pages
vincentkoc May 6, 2026
f4a6394
docs: typography hygiene across 6 pages
vincentkoc May 6, 2026
b971eba
fix(exec-approvals): guard Windows rename fallback (#77907)
Alex-Alaniz May 6, 2026
cbc228f
docs: explain blocked plugin ownership repair
steipete May 6, 2026
777c539
fix: harden sandboxed patch parent paths
steipete May 6, 2026
ebb8bed
fix: cap memory wiki filenames for safe writes
steipete May 6, 2026
4ee234f
docs: typography hygiene across 6 pages
vincentkoc May 6, 2026
b5c33bc
fix(discord): avoid false heartbeat ACK timeouts
bryce-d-greybeard May 6, 2026
d7bd9fe
fix(discord): route guild text commands (#78080)
steipete May 6, 2026
bca16d0
fix(telegram): finalize streamed text in place
obviyus May 5, 2026
25fc85a
test(telegram): cover single stream delivery
obviyus May 5, 2026
512f777
test(qa): thread telegram long final prompts
obviyus May 5, 2026
748d6dc
test(qa): assert telegram streamed final count
obviyus May 5, 2026
e27f179
fix(telegram): verify final stream edit landed
obviyus May 5, 2026
814b125
fix(telegram): separate progress drafts from final replies
obviyus May 6, 2026
3afc902
fix(telegram): finalize streamed replies in place (#77947)
obviyus May 6, 2026
68a82cb
docs: typography hygiene + 2 in-body H1 removals across 6 pages
vincentkoc May 6, 2026
f35fb72
test: mock manifest normalization in fallback tests
steipete May 6, 2026
0d73f17
docs: typography hygiene + 2 in-body H1 removals across 5 pages
vincentkoc May 6, 2026
b85b1c6
Refactor file access to use fs-safe primitives (#78255)
steipete May 6, 2026
2df7ec5
test: avoid bundled channel cold loads in message tool tests
steipete May 6, 2026
c5ea7c4
docs: typography hygiene across 6 pages
vincentkoc May 6, 2026
5d7262c
test: align telegram reply assertions with streaming defaults
steipete May 6, 2026
eecda91
fix(msteams): surface network errors blocking bot JWT validation and …
Beandon13 May 6, 2026
fb42c72
fix(plugins): repair peer links after npm updates
ProspectOre May 5, 2026
4d248b8
test(plugins): remove unnecessary peer-link assertion
ProspectOre May 5, 2026
d221d7b
fix(plugins): isolate peer-link repair failures
ProspectOre May 6, 2026
ea26a9d
fix: omit xAI reasoning efforts
steipete May 6, 2026
41736de
docs: audit and fix 4 pages (pi version bump + 3 typography/H1)
vincentkoc May 6, 2026
82c4fd8
test: cache fallback metadata snapshot
steipete May 6, 2026
1ded8de
docs: audit and fix 3 pages (typography across help/channels)
vincentkoc May 6, 2026
afc2c2e
test(browser): avoid real retry waits
steipete May 6, 2026
e9987ff
fix: clamp xAI live gateway thinking
steipete May 6, 2026
be1c99b
test: pass env to fallback metadata snapshot
steipete May 6, 2026
5b00cd1
fix: narrow Gateway proxy bypass target (#77018)
jesse-merhi May 6, 2026
cbaf999
docs: audit and fix 4 pages (sentence-case headings + Related links)
vincentkoc May 6, 2026
6da5eda
test: avoid real waits in cdp and outbound tests
steipete May 6, 2026
9630730
docs: audit and fix 5 pages (sentence-case headings + Related/title)
vincentkoc May 6, 2026
f2ce838
test: avoid spawning cli help in metadata test
steipete May 6, 2026
8a68ea0
changelog: add xAI thinking-profile clamp entry
vincentkoc May 6, 2026
1f6ce72
test: trim cron and context-engine waits
steipete May 6, 2026
981e32d
docs(reference): audit and fix 4 pages (typography, dup H1, Related)
vincentkoc May 6, 2026
06c490f
test: support higher vitest shard parallelism
steipete May 6, 2026
f531eff
docs: audit and fix 5 pages (typography hygiene + dup H1)
vincentkoc May 6, 2026
4ec693a
test: interleave cold full-suite shards
steipete May 6, 2026
f505c84
docs: typography hygiene across 7 high-traffic pages
vincentkoc May 6, 2026
6c74302
test: stabilize active memory timeout mocks
steipete May 6, 2026
b23232d
docs: typography hygiene across 6 pages (mac platform + sandbox/wizard)
vincentkoc May 6, 2026
6febffb
test: harden active memory timeout specs
steipete May 6, 2026
e85fd2a
docs: typography hygiene + dup H1 across 5 pages (cli/gateway/help)
vincentkoc May 6, 2026
03e6a02
Windows startup: handle localized schtasks access denied
yfge May 6, 2026
5f783d7
Plugin skills: use Windows junction links
hclsys May 6, 2026
fa2a32d
docs: typography hygiene across 6 pages (cli/gateway/platforms)
vincentkoc May 6, 2026
5da9f5e
test: remove cli retry test waits
steipete May 6, 2026
1672d35
perf: avoid no-op plugin auto-enable scans
steipete May 6, 2026
98cbf7f
fix: show current think level in Telegram picker (#78278)
obviyus May 6, 2026
85ed972
fix: lazy-load undici dispatchers
shakkernerd May 6, 2026
95652d5
test: cover no-proxy undici startup
shakkernerd May 6, 2026
6cf7ae1
docs: note plugin fetch dispatcher fix
shakkernerd May 6, 2026
6807da5
fix(net): preserve no-proxy undici stream timeouts
vincentkoc May 6, 2026
c9c66d7
fix: restore no-proxy dispatcher boundary
shakkernerd May 6, 2026
d52f581
fix: avoid fetch runtime proxy imports
shakkernerd May 6, 2026
7544bee
fix: preserve embedded dispatcher timeouts
shakkernerd May 6, 2026
627b007
test: remove gateway restart delay wait
steipete May 6, 2026
6921a47
docs: typography hygiene across 6 pages (channels/nodes/mac platforms)
vincentkoc May 6, 2026
eb4d654
docs: typography hygiene across 6 pages (start/tools/nodes/mac/platfo…
vincentkoc May 6, 2026
5107384
fix: stabilize Matrix tool progress QA (#78179)
Patrick-Erichsen May 6, 2026
506b0bb
docs(providers): remove duplicate H1 in provider directory
vincentkoc May 6, 2026
c0c3819
changelog: add Matrix approval delivery retry entry (#78179)
vincentkoc May 6, 2026
8cc762d
fix(feishu): keep topic sessions stable
steipete May 6, 2026
8e53349
fix(plugins): repair managed npm openclaw peers
steipete May 6, 2026
24fc6a4
docs(providers/senseaudio): add missing Related section
vincentkoc May 6, 2026
5e05052
fix(line): require wildcard for open dm policy
steipete May 6, 2026
cf83c58
docs: clarify targeted local validation
steipete May 6, 2026
8f3a34e
refactor: share fs-safe JSON helpers
steipete May 6, 2026
ecf06d7
test(line): narrow config schema parse failures
steipete May 6, 2026
852b9e7
docs(channels/line): fix smart apostrophe
vincentkoc May 6, 2026
ba1800e
fix: reuse plugin snapshot for embedded settings
shakkernerd May 6, 2026
5655c2b
fix: pass current snapshot to embedded runs
shakkernerd May 6, 2026
df20958
fix: reuse plugin snapshot for auto enable
shakkernerd May 6, 2026
fe393e4
fix: reuse plugin snapshot for read-only channels
shakkernerd May 6, 2026
d46859d
fix: reuse plugin snapshot for agent metadata
shakkernerd May 6, 2026
934247b
docs: note gateway metadata scan reuse
shakkernerd May 6, 2026
e376073
test: trim codex app-server test setup
steipete May 6, 2026
f956d09
test: avoid discord native command cold load
steipete May 6, 2026
f8bb00b
fix(deps): override vulnerable ip-address
vincentkoc May 6, 2026
13504f6
docs(tools/brave-search): remove duplicate H1
vincentkoc May 6, 2026
95fd321
test: mock web provider fast-path artifacts
steipete May 6, 2026
53809e5
docs(install/ansible): remove duplicate H1
vincentkoc May 6, 2026
900e416
test: avoid deepseek loader cold path
steipete May 6, 2026
3f210b1
fix: show Codex tool progress in channel drafts (#77949)
keshavbotagent May 6, 2026
8cc6638
docs(cli): fix smart apostrophes in dns and health
vincentkoc May 6, 2026
1a8a72e
changelog: credit @keshavbotagent for #77949
vincentkoc May 6, 2026
e59890e
test: speed up gateway cron history case
steipete May 6, 2026
8bfec5b
fix(sessions): fast-path qualified row model refs
May 6, 2026
948375f
Optimize session list model row resolution
May 6, 2026
ef517e1
Preserve session list model normalization
May 6, 2026
6be5422
fix(gateway): avoid plugin model resolution in session lists
obviyus May 6, 2026
3e0fcaf
test(codex): use full runtime plan in app server tests
obviyus May 6, 2026
c5fcfa1
test: remove reload deferral wait
steipete May 6, 2026
5969ac8
test: parallelize plugin package scan
steipete May 6, 2026
3915089
test: cache provider contract entries
steipete May 6, 2026
58f81b0
fix(codex): honor OAuth contextTokens in native harness
lilesjtu May 6, 2026
329580c
fix(onboard): recover externalized channel plugin from stale config (…
sliverp May 6, 2026
af2719a
docs(changelog): add entry for #78328 onboard stale channel plugin fa…
sliverp May 6, 2026
9edeffc
fix(codex/app-server): forward bootstrap into developerInstructions (…
lonexreb May 6, 2026
3fb1abc
test: isolate directory contract fixtures
steipete May 6, 2026
54e23b6
test: satisfy lint in optimized tests
steipete May 6, 2026
2eaf8ad
feat(plugins): support npm pack installs
steipete May 6, 2026
a1b49c4
fix: stabilize google meet twilio joins
steipete May 6, 2026
3e04755
docs: add Frank Yang to maintainers
frankekn May 6, 2026
b902d86
fix(cli): pass instructions for local openai-codex model probes (#76470)
lilesjtu May 6, 2026
0ddbf2e
fix(plugins): keep managed npm mutations in legacy peer mode
vincentkoc May 6, 2026
ff655cb
fix: preserve subagent task overrides (#78356)
amknight May 6, 2026
ce8b0da
test: slim secret runtime coverage
steipete May 6, 2026
674c447
ci: move additional checks to blacksmith
steipete May 6, 2026
85ded4d
pdf: add Codex instructions for extraction fallback (#51329)
anyech May 6, 2026
5cf55ed
fix(openai): suppress stale Codex OAuth models
steipete May 6, 2026
0b88d62
chore: bump version to 2026.5.6
steipete May 6, 2026
aca8440
fix(diagnostics): export talk and recovery metrics
vincentkoc May 6, 2026
8d9e7c8
chore(plugin-sdk): refresh api baseline
vincentkoc May 6, 2026
827e602
fix(diagnostics): include talk events in stability snapshots
vincentkoc May 6, 2026
d9ffc1a
fix cron run binding route (#78373)
amknight May 6, 2026
e2501b2
fix(diagnostics): export Talk metrics after SDK refactor
vincentkoc May 6, 2026
34dc7f6
Merge pull request #78378 from openclaw/fix/diagnostics-talk-prom
vincentkoc May 6, 2026
a24d5fe
perf(config): avoid duplicate plugin auto-enable channel probes
steipete May 6, 2026
ffafa90
test(agents): avoid provider runtime in fallback tests
steipete May 6, 2026
e437763
fix(agents): deliver agent TTS audio when block streaming is off (#78…
Conan-Scott May 6, 2026
8cb5881
test(openai): align codex modern model expectation
steipete May 6, 2026
34b67c3
fix(web_search): skip redundant provider re-resolution for external B…
openperf May 6, 2026
39b1731
ci: parallelize release publish workflows
steipete May 5, 2026
bf0f547
fix(release): tolerate optional plugin beta tag mirror failure
steipete May 6, 2026
ceaa56f
fix(release): stabilize final validation checks
steipete May 6, 2026
b895c6d
Gate Slack startup user allowlist resolution [AI] (#77898)
pgondhi987 May 6, 2026
5d55717
fix(plugins): apply npm overrides to managed roots (#78386)
vincentkoc May 6, 2026
3323327
test(voice-call): wait for media stream readiness
steipete May 6, 2026
7a73b37
fix memory wiki empty related blocks (#78399)
amknight May 6, 2026
fa44500
fix(acp): preserve streamed progress chunks (#78383)
amknight May 6, 2026
28e27ca
fix(msteams): preserve proactive thread replies (#78387)
amknight May 6, 2026
16321a2
fix(talk): add bounded lifecycle logging
vincentkoc May 6, 2026
1fe15f2
docs(logging): document bounded Talk log records
vincentkoc May 6, 2026
9e7fd27
ci: narrow MiniMax release live gateway lane
steipete May 6, 2026
1c29156
fix: recognize custom compaction conversation (#78390)
amknight May 6, 2026
cbba122
test(update-cli): cleanup temp dirs after each case (#78408)
hxy91819 May 6, 2026
1d3efb7
test(perf): trim focused runtime contract imports
steipete May 6, 2026
a3aa0a4
fix(test): harden docker live harness
vincentkoc May 6, 2026
64ab50e
fix(update): preserve plugin warning context
vincentkoc May 6, 2026
dfb160d
test(docker): widen live profile lane timeout
vincentkoc May 6, 2026
359c609
test(docker): isolate live gateway profile plugins
vincentkoc May 6, 2026
11f0aee
test(docker): use matrix live gateway image
vincentkoc May 6, 2026
8a47c79
test(docker): preserve live gateway heap
vincentkoc May 6, 2026
ff09f80
test(docker): scope live gateway discovery
vincentkoc May 6, 2026
c686eda
test(docker): bound live gateway setup
vincentkoc May 6, 2026
87f3501
test(docker): skip external auth sync in filtered gateway live
vincentkoc May 6, 2026
377c697
test(docker): hydrate openwebui live profile
vincentkoc May 6, 2026
6c7c0e5
test(docker): hydrate codex harness live profile
vincentkoc May 6, 2026
2dc8748
test(gateway): accept compact codex status
vincentkoc May 6, 2026
53423a2
test(gateway): disable heartbeat in codex bind live
vincentkoc May 6, 2026
5e218b4
test(gateway): capture codex bind outbound replies
vincentkoc May 6, 2026
a2f1d1d
fix(reply): keep text command replies visible
vincentkoc May 6, 2026
e4b629c
test(gateway): deliver codex bind commands
vincentkoc May 6, 2026
7fd7f6f
fix(gateway): mark chat slash commands as text
vincentkoc May 6, 2026
3d46e2c
test(docker): pass openai env to codex npm plugin lane
vincentkoc May 6, 2026
1df3850
test(docker): source testbox profile for codex npm plugin
vincentkoc May 6, 2026
2c7c19a
test(docker): use api-key auth for codex cli live lane
vincentkoc May 6, 2026
4996153
test(docker): source cli backend live profile before auth check
vincentkoc May 6, 2026
86c4809
test(gateway): skip opencode acp image probe by default
vincentkoc May 6, 2026
8256b74
test(perf): narrow provider contract imports
steipete May 6, 2026
7af6c25
ci: cap native MiniMax release live gateway lane
steipete May 6, 2026
bb25e48
test(scripts): clean up temp dirs after each case (#78421)
hxy91819 May 6, 2026
9bcb56b
test(perf): narrow runtime web tools state test
steipete May 6, 2026
cf21cba
ci: harden release validation harness checks
steipete May 6, 2026
fc1e2c5
fix(reply): preserve private group replies for text turns
steipete May 6, 2026
cc9f88e
ci: fix release cross-os loader path
steipete May 6, 2026
c4537fa
test(perf): shorten codex app-server hot test
steipete May 6, 2026
f0c1746
fix(agent): persist visible embedded final replies
obviyus May 6, 2026
440cf63
test(agent): cover Telegram transcript gap-fill
obviyus May 6, 2026
ba5f43b
docs(changelog): note Telegram transcript fix
obviyus May 6, 2026
2915f45
docs(changelog): add Telegram transcript PR attribution
obviyus May 6, 2026
1c42c77
feat: add user input blocking lifecycle gates (#75035)
jesse-merhi May 6, 2026
b559fce
test(net): cover stalled dispatcher close after fetch timeout
obviyus May 6, 2026
2465217
fix(net): bound guarded fetch dispatcher cleanup
obviyus May 6, 2026
855a7c7
docs(changelog): note web fetch timeout cleanup (#78439)
obviyus May 6, 2026
5d7878d
test(perf): narrow codex session key test
steipete May 6, 2026
14a113f
test(perf): remove codex hook polling
steipete May 6, 2026
0bc83b0
test(perf): narrow codex harness test import
steipete May 6, 2026
12a42bf
test(perf): narrow codex trajectory import
steipete May 6, 2026
458ce2d
test(perf): settle codex hook turn startup
steipete May 6, 2026
20906f5
fix: make conversation labels work with Codex (#78450)
simplyclever914 May 6, 2026
3317b79
test(perf): avoid codex hook runtime plan setup
steipete May 6, 2026
d4b4660
config: stop automatic writes and guard Nix mutators (#78047)
joshp123 May 6, 2026
2d5df74
test(perf): avoid codex failure runtime plan setup
steipete May 6, 2026
7748021
fix(update): preserve pnpm custom global root (#78393)
amknight May 6, 2026
6f75869
Add strict tool mode implementation
wzhgba Apr 20, 2026
7202fe8
Implement strict tool mode MVP foundations and contract coverage
Apr 27, 2026
c1b97cc
strict-tool-mode: wire config toolStrictness.mode to runtime and tran…
Apr 29, 2026
b18f000
strict-tool-mode: serialize tool_strictness_report in gateway HTTP re…
Apr 29, 2026
372ef49
strict-tool-mode: complete report contracts
Apr 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
43 changes: 43 additions & 0 deletions .agents/skills/crabbox/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ Blacksmith fallback playbook.
command -v crabbox
../crabbox/bin/crabbox --version
pnpm crabbox:run -- --help | sed -n '1,120p'
../crabbox/bin/crabbox desktop launch --help
../crabbox/bin/crabbox webvnc --help
```

- OpenClaw scripts prefer `../crabbox/bin/crabbox` when present. The user PATH
Expand Down Expand Up @@ -139,6 +141,35 @@ pnpm crabbox:stop -- <id-or-slug>
blacksmith testbox stop --id <tbx_id>
```

## Interactive Desktop And WebVNC

Prefer WebVNC for human inspection because the browser portal can preload the
lease VNC password and avoids a native VNC client's copy/paste/password dance.
Use native `crabbox vnc` only when WebVNC is unavailable, the browser portal is
broken, or the user explicitly wants a local VNC client.

Common desktop flow:

```sh
../crabbox/bin/crabbox warmup --provider hetzner --desktop --browser --class standard --idle-timeout 60m --ttl 240m
../crabbox/bin/crabbox desktop launch --provider hetzner --id <cbx_id-or-slug> --browser --url https://example.com --webvnc --open
```

Useful WebVNC commands:

```sh
../crabbox/bin/crabbox webvnc --provider hetzner --id <cbx_id-or-slug> --open
../crabbox/bin/crabbox webvnc --provider hetzner --id <cbx_id-or-slug> --daemon --open
../crabbox/bin/crabbox webvnc --provider hetzner --id <cbx_id-or-slug> --status
../crabbox/bin/crabbox webvnc --provider hetzner --id <cbx_id-or-slug> --stop
../crabbox/bin/crabbox screenshot --provider hetzner --id <cbx_id-or-slug> --output desktop.png
```

`desktop launch --webvnc --open` is usually the nicest one-shot: it starts the
browser/app inside the visible session, bridges the lease into the authenticated
WebVNC portal, and opens the portal. Keep browsers windowed for human QA; use
`--fullscreen` only for capture/video workflows.

## If Crabbox Fails

Keep the fallback narrow. First decide whether the failure is Crabbox itself,
Expand Down Expand Up @@ -266,6 +297,18 @@ It should include `broker.url`, `broker.token`, and usually `provider: aws`
for owned-cloud lanes. Do not let that config override the OpenClaw default
when Blacksmith proof is requested; pass `--provider blacksmith-testbox`.

### Interactive Desktop / WebVNC

For human desktop demos, prefer `webvnc` over native `vnc` and keep the remote
desktop visible/windowed. Do not fullscreen the remote browser or hide the XFCE
panel/window chrome unless the explicit goal is video/capture output. After
launch, verify a screenshot shows the desktop panel plus browser title bar. If
Chrome is fullscreen, toggle it back with:

```sh
crabbox run --id <lease> --shell -- 'DISPLAY=:99 xdotool search --onlyvisible --class google-chrome windowactivate key F11'
```

## Diagnostics

```sh
Expand Down
59 changes: 58 additions & 1 deletion .agents/skills/openclaw-pr-maintainer/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: openclaw-pr-maintainer
description: Review, triage, close, label, comment on, or land OpenClaw PRs/issues with maintainer evidence checks.
description: Use immediately for any pasted OpenClaw GitHub issue or PR URL/number, and for OpenClaw issue/PR review, triage, duplicate search, opener identity/who wrote it, author account age/activity, comments, labels, close, land, or maintainer evidence checks.
---

# OpenClaw PR Maintainer
Expand All @@ -24,6 +24,63 @@ gitcrawl search openclaw/openclaw --query "<scope or title keywords>" --mode hyb
gitcrawl cluster-detail openclaw/openclaw --id <cluster-id> --member-limit 20 --body-chars 280 --json
```

## Surface opener identity

- For every reviewed, triaged, closed, or landed issue/PR, show the opener's human name when available, GitHub login, and account age.
- 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}'`.
- Report opener identity as one compact line:
`By: Jane Doe (@jane, acct 2021-04-03) | OpenClaw: 4 PRs, 2 issues, 11 commits/12mo | GitHub: 9 repos, 86 commits, 9 PRs, 3 issues, 12 reviews`
- Always show recent activity in two lanes: OpenClaw-local PRs, issues, and commits in the last 12 months; and general public GitHub activity over the same window. For linked issue-fixing PRs, include both the PR author and issue opener when they differ.
- Prefer the bundled helper for activity lookups:

```bash
.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh <login> [other-login...]
.agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh --global <login>
```

- The helper reports repo-local activity first and can fetch public GitHub contribution totals for the same window with `--global`; run the global form by default for review/triage identity summaries.
- If the global contribution graph reports zero or looks inconsistent with visible public activity, sanity-check with `gh api users/<login>`, `gh api 'users/<login>/events/public?per_page=100'`, and recent public repo commits before calling the account inactive.
- 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.
- If the contribution graph is misleading or zero but public events/repos show activity, keep it one line, for example:
`By: pickaxe (@ProspectOre, acct 2019-08-24) | OpenClaw: 5 PRs, 0 issues, 5 commits/12mo | GitHub: 5 repos, 29 recent events, 100 public own-repo commits; graph=0`
- 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.
- 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.

## Suppress top-maintainer items in issue triage

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.

Suppress by default when the opener/author is one of:

- `@vincentkoc`
- `@Takhoffman`
- `@gumadeiras`
- `@obviyus`
- `@shakkernerd`
- `@mbelinky`
- `@joshavant`
- `@ngutman`
- `@vignesh07`
- `@huntharo`

Also suppress lower-priority maintainer-owned noise from the broader keep/top-maintainer group unless it is directly relevant:

- `@thewilloftheshadow`
- `@onutc` / `@osolmaz`
- `@jacobtomlinson`
- `@tyler6204`
- `@velvet-shark`
- `@jalehman`
- `@frankekn`
- `@ImLukeF`
- `@mcaxtr`

Exceptions:

- 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.
- 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.
- Do not close, label, or deprioritize solely because an item is maintainer-authored; this section only controls what appears in triage shortlists.

## Apply close and triage labels correctly

- 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.
Expand Down
178 changes: 178 additions & 0 deletions .agents/skills/openclaw-pr-maintainer/scripts/github-activity.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
#!/usr/bin/env bash
set -euo pipefail

repo="openclaw/openclaw"
months="12"
include_global="0"

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"
}

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
}

need gh
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
14 changes: 14 additions & 0 deletions .agents/skills/openclaw-qa-testing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,20 @@ gh workflow run "NPM Telegram Beta E2E" --repo openclaw/openclaw --ref main \
gh api repos/openclaw/openclaw/actions/runs/<run-id>/artifacts
```

## WhatsApp live credentials

Use this when setting up or replacing Convex `kind=whatsapp` credentials.

- Treat WhatsApp QA credentials as operator-owned live accounts, not generated fixtures.
- Use two dedicated WhatsApp-capable test numbers: one driver account and one SUT account. Do not use personal numbers or personal OpenClaw WhatsApp accounts in the shared pool.
- Register and link each account manually with WhatsApp or WhatsApp Business, storing Web auth only in isolated local auth dirs outside the repo.
- For group coverage, create a dedicated test group that includes both QA accounts and store its JID as `groupJid`; otherwise the group mention-gating scenario should be skipped by default and fail when explicitly requested.
- Package the two Baileys auth dirs into base64 `.tgz` payload fields and add a new active Convex credential row. Prefer adding a fresh row and disabling stale/broken rows over overwriting credentials in place.
- Expected payload fields: `driverPhoneE164`, `sutPhoneE164`, `driverAuthArchiveBase64`, `sutAuthArchiveBase64`, and optional `groupJid`.
- Keep credential material out of the repo, logs, PRs, and screenshots. Redact phone numbers unless the operator explicitly asks for local debugging.
- Validate with `pnpm openclaw qa whatsapp --credential-source convex --credential-role maintainer --provider-mode mock-openai` and preserve artifact paths plus redacted pass/fail summaries.
- If WhatsApp expires or invalidates a linked Web session, relink locally, package fresh auth archives, add a new Convex row, then disable the stale row.

## Character evals

Use `qa character-eval` for style/persona/vibe checks across multiple live models.
Expand Down
10 changes: 6 additions & 4 deletions .agents/skills/openclaw-release-maintainer/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,12 @@ Use this skill for release and publish-time workflow. Keep ordinary development
config footprint move, so do not blindly copy stale replacement annotations
into release notes.
- Do not delete or rewrite beta tags after their matching npm package has been
published. If a pushed beta tag fails preflight before npm publish, delete and
recreate the tag and prerelease at the fixed commit so npm prerelease versions
stay contiguous. If a published beta needs a fix, commit the fix on the
release branch and increment to the next `-beta.N`.
published. If a pushed beta tag fails before npm publish, the version is not
consumed: keep the same `-beta.N`, delete/recreate or force-move the git tag
and prerelease to the fixed commit, and rerun preflight. Do not increment to
the next beta number until the matching npm package has actually published.
If a published beta needs a fix, commit the fix on the release branch and
increment to the next `-beta.N`.
- For a beta release train, run the fast local preflight first, publish the
beta to npm `beta`, then run the expensive published-package roster focused
on install/update/Docker/Parallels/NPM Telegram. If anything fails, fix it on
Expand Down
12 changes: 12 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ If this PR fixes a plugin beta-release blocker, title it `fix(<plugin-id>): beta
- Related #
- [ ] This PR fixes a bug or regression

## Real behavior proof (required for external PRs)

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.

- Behavior or issue addressed:
- Real environment tested:
- Exact steps or command run after this patch:
- Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):
- Observed result after fix:
- What was not tested:
- Before evidence (optional but encouraged):

## Root Cause (if applicable)

For bug fixes or regressions, explain why this happened, not just what changed. Otherwise write `N/A`. If the cause is unclear, write `Unknown`.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/auto-response.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
issue_comment:
types: [created]
pull_request_target: # zizmor: ignore[dangerous-triggers] maintainer-owned label automation; trusted base checkout only, no untrusted PR code execution
types: [opened, edited, synchronize, reopened, labeled]
types: [opened, edited, synchronize, reopened, labeled, unlabeled]

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1461,7 +1461,7 @@ jobs:
name: ${{ matrix.check_name }}
needs: [preflight]
if: ${{ !cancelled() && always() && needs.preflight.outputs.run_check_additional == 'true' }}
runs-on: ubuntu-24.04
runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }}
timeout-minutes: 20
strategy:
fail-fast: false
Expand Down
Loading
Loading