Skip to content

Commit 30e5cec

Browse files
committed
chore: merge main into Codex dynamic tools
2 parents a9e1f0e + aa74888 commit 30e5cec

598 files changed

Lines changed: 15231 additions & 6229 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/blacksmith-testbox/SKILL.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ description: Run Blacksmith Testbox for CI-parity checks, secrets, hosted servic
1010
Use Testbox when you need remote CI parity, injected secrets, hosted services,
1111
or an OS/runtime image that your local machine cannot provide cheaply.
1212

13+
For OpenClaw, Crabbox is a supported alternative when Blacksmith is unavailable
14+
or owned cloud capacity is preferable.
15+
1316
Do not default to Testbox for every local test/build loop. If the repo has
1417
documented local commands for normal iteration, use those first so you keep
1518
warm caches, local build state, and fast feedback.

.agents/skills/crabbox/SKILL.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
---
2+
name: crabbox
3+
description: Use Crabbox for OpenClaw remote Linux validation, warmed reusable boxes, GitHub Actions hydration, sync timing, logs, results, caches, and lease cleanup.
4+
---
5+
6+
# Crabbox
7+
8+
Use Crabbox when OpenClaw needs remote Linux proof on owned capacity, a large
9+
runner class, reusable warm state, or a Blacksmith alternative.
10+
11+
## Before Running
12+
13+
- Run from the repo root. Crabbox sync mirrors the current checkout.
14+
- Prefer local targeted tests for tight edit loops.
15+
- Prefer Blacksmith Testbox when the task explicitly asks for Blacksmith or a
16+
Blacksmith-specific CI comparison.
17+
- Use Crabbox for broad OpenClaw gates when owned AWS/Hetzner capacity is the
18+
right remote lane.
19+
- Check `.crabbox.yaml` for repo defaults before adding flags.
20+
- Install with `brew install openclaw/tap/crabbox`; auth is required before use:
21+
`printf '%s' "$CRABBOX_COORDINATOR_TOKEN" | crabbox login --url https://crabbox-coordinator.steipete.workers.dev --provider aws --token-stdin`.
22+
- On macOS the user config is `~/Library/Application Support/crabbox/config.yaml`;
23+
it must include `broker.url`, `broker.token`, and usually `provider: aws`.
24+
25+
## OpenClaw Flow
26+
27+
Warm a reusable box:
28+
29+
```sh
30+
pnpm crabbox:warmup -- --idle-timeout 90m
31+
```
32+
33+
Hydrate it through the repository workflow:
34+
35+
```sh
36+
pnpm crabbox:hydrate -- --id <cbx_id-or-slug>
37+
```
38+
39+
Run broad proof:
40+
41+
```sh
42+
pnpm crabbox:run -- --id <cbx_id-or-slug> --shell "OPENCLAW_TESTBOX=1 pnpm check:changed"
43+
pnpm crabbox:run -- --id <cbx_id-or-slug> --shell "corepack enable && pnpm install --frozen-lockfile && pnpm test"
44+
```
45+
46+
Stop boxes you created before handoff:
47+
48+
```sh
49+
pnpm crabbox:stop -- <cbx_id-or-slug>
50+
```
51+
52+
## Useful Commands
53+
54+
```sh
55+
crabbox status --id <id-or-slug> --wait
56+
crabbox inspect --id <id-or-slug> --json
57+
crabbox sync-plan
58+
crabbox history --lease <id-or-slug>
59+
crabbox logs <run_id>
60+
crabbox results <run_id>
61+
crabbox cache stats --id <id-or-slug>
62+
crabbox ssh --id <id-or-slug>
63+
```
64+
65+
Use `--debug` on `run` when measuring sync timing.
66+
67+
## Hydration Boundary
68+
69+
`.github/workflows/crabbox-hydrate.yml` is repo-specific on purpose. It owns
70+
OpenClaw checkout, setup-node, pnpm setup, provider env hydration, ready marker,
71+
and keepalive. Crabbox owns runner registration, workflow dispatch, SSH sync,
72+
command execution, logs/results, local lease claims, and idle cleanup.
73+
74+
Do not add OpenClaw-specific setup to Crabbox. Put repo setup in the hydration
75+
workflow and generic lease/sync behavior in Crabbox.
76+
77+
## Cleanup
78+
79+
Crabbox has coordinator-owned idle expiry and local lease claims, so OpenClaw
80+
does not need a custom ledger. Default idle timeout is 30 minutes unless config
81+
or flags set a different value. Still stop boxes you created when done.

.crabbox.yaml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ capacity:
99
- eu-west-1
1010
actions:
1111
workflow: .github/workflows/crabbox-hydrate.yml
12+
job: hydrate
1213
ref: main
1314
runnerLabels:
1415
- crabbox
@@ -26,14 +27,8 @@ sync:
2627
baseRef: main
2728
exclude:
2829
- .artifacts
29-
- .cache
3030
- .codex
3131
- .DS_Store
32-
- .turbo
33-
- coverage
34-
- dist
35-
- dist-runtime
36-
- node_modules
3732
- playwright-report
3833
- test-results
3934
env:

.github/workflows/crabbox-hydrate.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,19 @@ on:
77
description: "Crabbox lease ID"
88
required: true
99
type: string
10+
ref:
11+
description: "Git ref to hydrate"
12+
required: false
13+
type: string
1014
crabbox_runner_label:
1115
description: "Dynamic Crabbox runner label"
1216
required: true
1317
type: string
18+
crabbox_job:
19+
description: "Hydration job identifier expected by Crabbox"
20+
required: false
21+
default: "hydrate"
22+
type: string
1423
crabbox_keep_alive_minutes:
1524
description: "Minutes to keep the hydrated job alive"
1625
required: false
@@ -30,6 +39,8 @@ jobs:
3039
timeout-minutes: 120
3140
steps:
3241
- uses: actions/checkout@v6
42+
with:
43+
ref: ${{ inputs.ref || github.ref }}
3344

3445
- name: Setup Node environment
3546
uses: ./.github/actions/setup-node-env
@@ -81,12 +92,37 @@ jobs:
8192
shell: bash
8293
run: |
8394
set -euo pipefail
95+
job="${{ inputs.crabbox_job }}"
96+
if [ -z "$job" ]; then job=hydrate; fi
8497
mkdir -p "$HOME/.crabbox/actions"
8598
state="$HOME/.crabbox/actions/${{ inputs.crabbox_id }}.env"
99+
env_file="$HOME/.crabbox/actions/${{ inputs.crabbox_id }}.env.sh"
100+
services_file="$HOME/.crabbox/actions/${{ inputs.crabbox_id }}.services"
101+
write_export() {
102+
key="$1"
103+
value="${!key-}"
104+
if [ -n "$value" ]; then
105+
printf 'export %s=%q\n' "$key" "$value"
106+
fi
107+
}
108+
{
109+
for key in CI GITHUB_ACTIONS GITHUB_WORKSPACE GITHUB_REPOSITORY GITHUB_RUN_ID GITHUB_RUN_NUMBER GITHUB_RUN_ATTEMPT GITHUB_REF GITHUB_REF_NAME GITHUB_SHA GITHUB_EVENT_NAME GITHUB_ACTOR RUNNER_OS RUNNER_ARCH RUNNER_TEMP RUNNER_TOOL_CACHE; do
110+
write_export "$key"
111+
done
112+
} > "${env_file}.tmp"
113+
mv "${env_file}.tmp" "$env_file"
114+
{
115+
echo "# Docker containers visible from the hydrated runner"
116+
docker ps --format '{{.Names}}\t{{.Image}}\t{{.Ports}}' 2>/dev/null || true
117+
} > "${services_file}.tmp"
118+
mv "${services_file}.tmp" "$services_file"
86119
tmp="${state}.tmp"
87120
{
88121
echo "WORKSPACE=${GITHUB_WORKSPACE}"
89122
echo "RUN_ID=${GITHUB_RUN_ID}"
123+
echo "JOB=${job}"
124+
echo "ENV_FILE=${env_file}"
125+
echo "SERVICES_FILE=${services_file}"
90126
echo "READY_AT=$(date -u +%Y-%m-%dT%H:%M:%SZ)"
91127
} > "$tmp"
92128
mv "$tmp" "$state"

.github/workflows/openclaw-live-and-e2e-checks-reusable.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ on:
3838
required: false
3939
default: openclaw@latest
4040
type: string
41+
published_upgrade_survivor_baselines:
42+
description: Optional exact baseline list for published-upgrade-survivor lane expansion
43+
required: false
44+
default: ""
45+
type: string
46+
published_upgrade_survivor_scenarios:
47+
description: Optional scenario list for published-upgrade-survivor lane expansion
48+
required: false
49+
default: ""
50+
type: string
4151
package_artifact_name:
4252
description: Existing workflow artifact containing openclaw-current.tgz; blank packs the selected ref
4353
required: false
@@ -123,6 +133,16 @@ on:
123133
required: false
124134
default: openclaw@latest
125135
type: string
136+
published_upgrade_survivor_baselines:
137+
description: Optional exact baseline list for published-upgrade-survivor lane expansion
138+
required: false
139+
default: ""
140+
type: string
141+
published_upgrade_survivor_scenarios:
142+
description: Optional scenario list for published-upgrade-survivor lane expansion
143+
required: false
144+
default: ""
145+
type: string
126146
package_artifact_name:
127147
description: Existing workflow artifact containing openclaw-current.tgz; blank packs the selected ref
128148
required: false
@@ -695,6 +715,8 @@ jobs:
695715
OPENCLAW_DOCKER_E2E_SELECTED_SHA: ${{ needs.validate_selected_ref.outputs.selected_sha }}
696716
OPENCLAW_CURRENT_PACKAGE_TGZ: .artifacts/docker-e2e-package/openclaw-current.tgz
697717
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC: ${{ inputs.published_upgrade_survivor_baseline }}
718+
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS: ${{ inputs.published_upgrade_survivor_baselines }}
719+
OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS: ${{ inputs.published_upgrade_survivor_scenarios }}
698720
OPENCLAW_SKIP_DOCKER_BUILD: "1"
699721
INCLUDE_OPENWEBUI: ${{ inputs.include_openwebui }}
700722
DOCKER_E2E_CHUNK: ${{ matrix.chunk_id }}
@@ -929,6 +951,8 @@ jobs:
929951
OPENCLAW_DOCKER_E2E_SELECTED_SHA: ${{ needs.validate_selected_ref.outputs.selected_sha }}
930952
OPENCLAW_CURRENT_PACKAGE_TGZ: .artifacts/docker-e2e-package/openclaw-current.tgz
931953
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC: ${{ inputs.published_upgrade_survivor_baseline }}
954+
OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS: ${{ inputs.published_upgrade_survivor_baselines }}
955+
OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS: ${{ inputs.published_upgrade_survivor_scenarios }}
932956
OPENCLAW_SKIP_DOCKER_BUILD: "1"
933957
INCLUDE_OPENWEBUI: ${{ inputs.include_openwebui }}
934958
DOCKER_E2E_LANES: ${{ matrix.group.docker_lanes }}

.github/workflows/package-acceptance.yml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ on:
6969
required: false
7070
default: openclaw@latest
7171
type: string
72+
published_upgrade_survivor_baselines:
73+
description: Optional baseline list for published-upgrade-survivor; use release-history for last 6 plus key legacy releases
74+
required: false
75+
default: ""
76+
type: string
77+
published_upgrade_survivor_scenarios:
78+
description: Optional scenario list for published-upgrade-survivor; use reported-issues for known upgrade failure shapes
79+
required: false
80+
default: ""
81+
type: string
7282
telegram_mode:
7383
description: Optional Telegram QA lane for the resolved package candidate
7484
required: true
@@ -139,6 +149,16 @@ on:
139149
required: false
140150
default: openclaw@latest
141151
type: string
152+
published_upgrade_survivor_baselines:
153+
description: Optional baseline list for published-upgrade-survivor; use release-history for last 6 plus key legacy releases
154+
required: false
155+
default: ""
156+
type: string
157+
published_upgrade_survivor_scenarios:
158+
description: Optional scenario list for published-upgrade-survivor; use reported-issues for known upgrade failure shapes
159+
required: false
160+
default: ""
161+
type: string
142162
telegram_mode:
143163
description: Optional Telegram QA lane for the resolved package candidate
144164
required: false
@@ -275,6 +295,8 @@ jobs:
275295
package_source_sha: ${{ steps.resolve.outputs.package_source_sha }}
276296
package_sha256: ${{ steps.resolve.outputs.sha256 }}
277297
package_version: ${{ steps.resolve.outputs.package_version }}
298+
published_upgrade_survivor_baselines: ${{ steps.upgrade_survivor_baselines.outputs.baselines }}
299+
published_upgrade_survivor_scenarios: ${{ inputs.published_upgrade_survivor_scenarios }}
278300
telegram_enabled: ${{ steps.profile.outputs.telegram_enabled }}
279301
telegram_mode: ${{ steps.profile.outputs.telegram_mode }}
280302
steps:
@@ -405,6 +427,44 @@ jobs:
405427
echo "package_artifact_name=${PACKAGE_ARTIFACT_NAME}"
406428
} >> "$GITHUB_OUTPUT"
407429
430+
- name: Resolve published upgrade survivor baselines
431+
id: upgrade_survivor_baselines
432+
env:
433+
FALLBACK_BASELINE: ${{ inputs.published_upgrade_survivor_baseline }}
434+
REQUESTED_BASELINES: ${{ inputs.published_upgrade_survivor_baselines }}
435+
GH_TOKEN: ${{ github.token }}
436+
shell: bash
437+
run: |
438+
set -euo pipefail
439+
if [[ -z "${REQUESTED_BASELINES// }" ]]; then
440+
echo "baselines=" >> "$GITHUB_OUTPUT"
441+
exit 0
442+
fi
443+
releases_json=""
444+
npm_versions_json=""
445+
if [[ "$REQUESTED_BASELINES" == *"release-history"* ]]; then
446+
releases_json=".artifacts/package-candidate-input/openclaw-releases.json"
447+
npm_versions_json=".artifacts/package-candidate-input/openclaw-npm-versions.json"
448+
mkdir -p "$(dirname "$releases_json")"
449+
gh release list --repo "$GITHUB_REPOSITORY" --limit 100 --json tagName,publishedAt,isPrerelease > "$releases_json"
450+
npm view openclaw versions --json > "$npm_versions_json"
451+
fi
452+
args=(
453+
--requested "$REQUESTED_BASELINES"
454+
--fallback "$FALLBACK_BASELINE"
455+
--github-output "$GITHUB_OUTPUT"
456+
)
457+
if [[ -n "$releases_json" ]]; then
458+
args+=(
459+
--releases-json "$releases_json"
460+
--npm-versions-json "$npm_versions_json"
461+
--history-count 6
462+
--include-version 2026.4.23
463+
--pre-date 2026-03-15T00:00:00Z
464+
)
465+
fi
466+
node scripts/resolve-upgrade-survivor-baselines.mjs "${args[@]}" >/dev/null
467+
408468
- name: Upload package-under-test artifact
409469
uses: actions/upload-artifact@v7
410470
with:
@@ -424,6 +484,8 @@ jobs:
424484
SUITE_PROFILE: ${{ inputs.suite_profile }}
425485
WORKFLOW_REF: ${{ inputs.workflow_ref }}
426486
PUBLISHED_UPGRADE_SURVIVOR_BASELINE: ${{ inputs.published_upgrade_survivor_baseline }}
487+
PUBLISHED_UPGRADE_SURVIVOR_BASELINES: ${{ steps.upgrade_survivor_baselines.outputs.baselines }}
488+
PUBLISHED_UPGRADE_SURVIVOR_SCENARIOS: ${{ inputs.published_upgrade_survivor_scenarios }}
427489
shell: bash
428490
run: |
429491
{
@@ -438,6 +500,8 @@ jobs:
438500
echo "- SHA-256: \`${PACKAGE_SHA256}\`"
439501
echo "- Profile: \`${SUITE_PROFILE}\`"
440502
echo "- Published upgrade survivor baseline: \`${PUBLISHED_UPGRADE_SURVIVOR_BASELINE}\`"
503+
echo "- Published upgrade survivor baselines: \`${PUBLISHED_UPGRADE_SURVIVOR_BASELINES}\`"
504+
echo "- Published upgrade survivor scenarios: \`${PUBLISHED_UPGRADE_SURVIVOR_SCENARIOS}\`"
441505
} >> "$GITHUB_STEP_SUMMARY"
442506
443507
docker_acceptance:
@@ -451,6 +515,8 @@ jobs:
451515
include_openwebui: ${{ needs.resolve_package.outputs.include_openwebui == 'true' }}
452516
docker_lanes: ${{ needs.resolve_package.outputs.docker_lanes }}
453517
published_upgrade_survivor_baseline: ${{ inputs.published_upgrade_survivor_baseline }}
518+
published_upgrade_survivor_baselines: ${{ needs.resolve_package.outputs.published_upgrade_survivor_baselines }}
519+
published_upgrade_survivor_scenarios: ${{ needs.resolve_package.outputs.published_upgrade_survivor_scenarios }}
454520
package_artifact_name: ${{ needs.resolve_package.outputs.package_artifact_name }}
455521
include_live_suites: ${{ needs.resolve_package.outputs.include_live_suites == 'true' }}
456522
live_models_only: false

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ USER.md
104104
.agents/skills/*
105105
!.agents/skills/blacksmith-testbox/
106106
!.agents/skills/blacksmith-testbox/**
107+
!.agents/skills/crabbox/
108+
!.agents/skills/crabbox/**
107109
!.agents/skills/gitcrawl/
108110
!.agents/skills/gitcrawl/**
109111
!.agents/skills/openclaw-ghsa-maintainer/

0 commit comments

Comments
 (0)