Skip to content

Commit 28e0b88

Browse files
authored
Merge branch 'main' into fix/fix-627
2 parents 926cf98 + 777a113 commit 28e0b88

1,269 files changed

Lines changed: 67602 additions & 16167 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/autoreview/SKILL.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ Use when:
2323
- Prefer small fixes at the right ownership boundary; no refactor unless it clearly improves the bug class.
2424
- Keep going until the selected review path returns no accepted/actionable findings.
2525
- If a review-triggered fix changes code, rerun focused tests and rerun the review helper.
26-
- Default to Codex review. If Codex is unavailable or exits with an error, the helper falls back to the first configured CLI from `claude -p`, `pi -p`, `opencode run`, `droid exec`, or `copilot`. Prefer Codex for final closeout because it uses native review mode; non-Codex reviewers use a Codex-inspired generated diff prompt. The helper runs nested Codex review in yolo/full-access mode by default; use `--no-yolo` only when intentionally testing sandbox behavior.
26+
- Default to Codex review with no fallback. Prefer Codex for final closeout because it uses native review mode; non-Codex reviewers use a Codex-inspired generated diff prompt. Use `--fallback-reviewer auto|claude|pi|opencode|droid|copilot` only when a second-model fallback is explicitly wanted and authenticated. The helper runs nested Codex review in yolo/full-access mode by default; use `--no-yolo` only when intentionally testing sandbox behavior.
2727
- Stop as soon as the review command/helper exits 0 with no accepted/actionable findings. Do not run an extra direct `codex review` just to get a nicer "clean" line, a second opinion, or clearer closeout wording.
2828
- Treat the helper's successful exit plus absence of actionable findings as the clean review result, even if the underlying Codex CLI output is terse.
2929
- If rejecting a finding as intentional/not worth fixing, add a brief inline code comment only when it explains a real invariant or ownership decision that future reviewers should know.
30+
- If creating or updating a PR while rejecting any autoreview finding, record the rejected finding and reason in the PR description so later reviewers can distinguish intentional design decisions from missed review output.
3031
- Do not push just to review. Push only when the user requested push/ship/PR update.
3132
- For OpenClaw maintainers, keep autoreview validation Crabbox/Testbox-aware when maintainer validation mode is enabled (`OPENCLAW_TESTBOX=1` or `AUTOREVIEW_OPENCLAW_MAINTAINER_VALIDATION=1`). A review pass may inspect files and run cheap non-Node probes, but it must not start local `pnpm`, Vitest, `tsgo`, `npm test`, or `node scripts/run-vitest.mjs` from a Codex/worktree review unless the operator explicitly requested local proof. For runtime proof, use existing evidence or route through Crabbox/Testbox and report the id. Do not apply this rule to ordinary contributors who do not have maintainer Testbox access.
3233

@@ -51,11 +52,11 @@ git fetch origin
5152
codex review --base origin/main
5253
```
5354

54-
Do not pass any prompt with `--base`. Some Codex CLI versions reject both inline
55-
and stdin prompt forms, including the helper's `codex review --base <ref> -`,
56-
with `--base <BRANCH> cannot be used with [PROMPT]`. If the helper hits this
57-
error, run plain `codex review --base <ref>` and report that the helper prompt
58-
injection was skipped.
55+
Do not pass any prompt with `--base`, `--commit`, or `--uncommitted`. Codex CLI
56+
review targets and custom review prompts are mutually exclusive: target modes
57+
generate their own review prompt internally. Use plain target review for native
58+
Codex closeout, or use custom prompt review (`codex review -`) only when you
59+
intentionally want a generated diff prompt instead of native target review.
5960

6061
If an open PR exists, use its actual base:
6162

@@ -116,13 +117,13 @@ The helper:
116117
- use `--mode commit --commit <ref>` for already-committed work, especially clean `main` after landing
117118
- should be left in `--mode auto` or forced to `--mode branch` for PR/branch work; do not force `--mode local` after committing
118119
- supports `--reviewer codex|claude|pi|opencode|droid|copilot|auto`; `auto` means Codex first
119-
- supports `--fallback-reviewer auto|claude|pi|opencode|droid|copilot|none`; default is configured CLI fallback
120+
- supports `--fallback-reviewer auto|claude|pi|opencode|droid|copilot|none`; default is `none`
120121
- falls back only when Codex is unavailable or exits nonzero, not when Codex reports findings
121122
- writes only to stdout unless `--output` or `AUTOREVIEW_OUTPUT` is set
122123
- supports `--dry-run`, `--parallel-tests`, and commit refs
123124
- runs nested review with `--dangerously-bypass-approvals-and-sandbox --sandbox danger-full-access` by default
124-
- injects maintainer-only OpenClaw validation policy into native Codex review when `OPENCLAW_TESTBOX=1` or `AUTOREVIEW_OPENCLAW_MAINTAINER_VALIDATION=1`, so local memory-heavy Node/Vitest checks are avoided in favor of Crabbox/Testbox proof
125-
- branch mode may fail on Codex CLI versions that reject `--base` plus the helper's stdin prompt; on that exact parser error, rerun plain `codex review --base <ref>` instead of falling back to a non-Codex reviewer
125+
- with `OPENCLAW_TESTBOX=1` or `AUTOREVIEW_OPENCLAW_MAINTAINER_VALIDATION=1`, disables auto local `pnpm run check` and routes Codex through generated prompt review (`codex review -`) so the no-local-heavy-tests policy is included; native Codex target review cannot accept extra prompt text
126+
- non-Codex reviewers receive the generated diff prompt and maintainer validation policy text when maintainer validation is active
126127
- keeps accepting `--full-access`; use `--no-yolo` or `AUTOREVIEW_YOLO=0` to opt out
127128
- still accepts legacy `CODEX_REVIEW_*` env vars when the matching `AUTOREVIEW_*` var is unset
128129
- prints `autoreview clean: no accepted/actionable findings reported` when the selected review command exits 0

.agents/skills/autoreview/scripts/autoreview

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ Options:
1111
--base REF Base ref for branch review. Default: PR base or origin/main.
1212
--commit REF Commit ref for commit review. Default: HEAD.
1313
--reviewer codex|claude|pi|opencode|droid|copilot|auto
14-
Review engine. Default: Codex with configured fallback on error.
14+
Review engine. Default: Codex.
1515
--fallback-reviewer auto|claude|pi|opencode|droid|copilot|none
16-
Fallback when Codex is unavailable or exits nonzero. Default: auto.
16+
Fallback when Codex is unavailable or exits nonzero. Default: none.
1717
--codex-bin PATH Codex binary. Default: codex.
1818
--claude-bin PATH Claude binary. Default: claude.
1919
--pi-bin PATH Pi binary. Default: pi.
@@ -44,7 +44,7 @@ mode=auto
4444
base_ref=
4545
commit_ref=HEAD
4646
reviewer=${AUTOREVIEW_REVIEWER:-${CODEX_REVIEW_REVIEWER:-auto}}
47-
fallback_reviewer=${AUTOREVIEW_FALLBACK_REVIEWER:-${CODEX_REVIEW_FALLBACK_REVIEWER:-auto}}
47+
fallback_reviewer=${AUTOREVIEW_FALLBACK_REVIEWER:-${CODEX_REVIEW_FALLBACK_REVIEWER:-none}}
4848
codex_bin=${CODEX_BIN:-codex}
4949
claude_bin=${CLAUDE_BIN:-claude}
5050
pi_bin=${PI_BIN:-pi}
@@ -58,7 +58,6 @@ parallel_tests=
5858
parallel_tests_auto=false
5959
dry_run=false
6060
codex_review_prompt=
61-
codex_review_stdin_prompt=false
6261
codex_review_prompt_file=false
6362
openclaw_maintainer_validation=${AUTOREVIEW_OPENCLAW_MAINTAINER_VALIDATION:-${OPENCLAW_TESTBOX:-0}}
6463

@@ -249,13 +248,8 @@ OpenClaw maintainer autoreview validation policy:
249248
- If remote validation is not necessary for the finding, state the targeted proof that should be run instead of starting local tests.
250249
EOF
251250
)
252-
if [[ "$review_kind" == local ]]; then
253-
review_cmd+=(-)
254-
codex_review_stdin_prompt=true
255-
else
256-
review_cmd=("$codex_bin" "${codex_args[@]}" review -)
257-
codex_review_prompt_file=true
258-
fi
251+
review_cmd=("$codex_bin" "${codex_args[@]}" review -)
252+
codex_review_prompt_file=true
259253
fi
260254

261255
printf 'autoreview target: %s\n' "$review_kind"
@@ -278,8 +272,8 @@ if [[ "$reviewer" == auto || "$reviewer" == codex ]]; then
278272
printf 'review:'
279273
printf ' %q' "${review_cmd[@]}"
280274
printf '\n'
281-
if [[ "$codex_review_stdin_prompt" == true || "$codex_review_prompt_file" == true ]]; then
282-
printf 'review policy: OpenClaw maintainer Crabbox/Testbox-aware validation prompt injected\n'
275+
if [[ "$codex_review_prompt_file" == true ]]; then
276+
printf 'review policy: OpenClaw maintainer validation active; using generated prompt review because Codex target review cannot accept extra prompt text\n'
283277
fi
284278
else
285279
printf 'review: %s prompt review\n' "$reviewer"
@@ -337,11 +331,8 @@ run_review() {
337331
rm -f "$prompt_file"
338332
prompt_file=
339333
return "$status"
340-
elif [[ "$codex_review_stdin_prompt" == true ]]; then
341-
printf '%s\n' "$codex_review_prompt" | "${review_cmd[@]}" 2>&1 | tee "$review_output"
342-
else
343-
"${review_cmd[@]}" 2>&1 | tee "$review_output"
344334
fi
335+
"${review_cmd[@]}" 2>&1 | tee "$review_output"
345336
}
346337

347338
diff_for_review() {

.agents/skills/crabbox/SKILL.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ pnpm crabbox:run -- --help | sed -n '1,120p'
4545
shim can be stale.
4646
- Check `.crabbox.yaml` for direct-provider defaults. Omitting `--provider`
4747
means brokered AWS today.
48+
- The brokered AWS default is a Linux developer image in `eu-west-1`; the repo
49+
config pins hot `eu-west-1a/b/c` placement so Fast Snapshot Restore can apply.
50+
If warmup drifts well past the minute-scale path, verify image promotion,
51+
region/AZ placement, and FSR state before blaming OpenClaw.
4852
- For broad OpenClaw maintainer `pnpm` gates, prefer the repo wrapper with
4953
`--provider blacksmith-testbox` or the repo Testbox helpers when the standing
5054
Testbox policy applies.
@@ -78,6 +82,25 @@ Use these only when the task needs an existing non-Linux host. OpenClaw broad
7882
Linux validation uses the repo Crabbox config unless a provider is explicitly
7983
requested.
8084

85+
Native brokered Windows is available for Windows-specific proof. Use the AWS
86+
developer image in `us-west-2` on demand; it has the expected OpenClaw developer
87+
toolchain and Docker image cache. Keep broad Linux gates on Linux/Testbox unless
88+
the bug is Windows-specific:
89+
90+
```sh
91+
../crabbox/bin/crabbox warmup \
92+
--provider aws \
93+
--target windows \
94+
--windows-mode normal \
95+
--region us-west-2 \
96+
--market on-demand \
97+
--timing-json
98+
```
99+
100+
The hydrate workflow assumes Docker should already be baked into Linux images
101+
and only installs it as a fallback. Do not add per-run Docker installs to proof
102+
commands unless the image probe shows Docker is actually missing.
103+
81104
When the user explicitly asks for brokered macOS runners, use Crabbox AWS
82105
macOS only after confirming the deployed coordinator supports EC2 Mac host
83106
lifecycle/image routes and the operator has AWS EC2 Mac Dedicated Host quota

.agents/skills/openclaw-release-ci/SKILL.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ git status --short --branch
2828
git rev-parse HEAD
2929
```
3030

31-
If env lacks keys, use `$one-password` to inject or set them, then rerun the script. The script prints only provider status and HTTP class, never tokens.
31+
1Password service-account values are the first source for release provider
32+
preflight. Inject those exact targeted keys first, then run the verifier; use
33+
ambient env only when it was already intentionally injected for this release.
34+
The script prints only provider status and HTTP class, never tokens.
3235

3336
## Dispatch
3437

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ live`; keep it clearly beta and avoid implying stable promotion.
170170
CI, validation, or internal release mechanics unless the release is explicitly
171171
about those. Peter prefers concrete user wins: features, integrations,
172172
workflow improvements, and practical reliability fixes.
173+
- Do not feature QA parity, test coverage, release gates, or validation lanes in
174+
user-facing launch tweets. Keep them for release notes or maintainer proof
175+
unless the operator explicitly asks for validation-focused copy.
176+
- Do not feature plugin-author or developer tooling such as SDK helpers,
177+
tool-plugin scaffolding, build/validate/init commands, or internal CLI
178+
plumbing in general user-facing launch tweets unless the operator explicitly
179+
asks for developer-focused copy.
173180
- Tone: high-signal, slightly cheeky, confident, not corporate. One joke is
174181
enough. Avoid punching down, insulting users, or promising what was not
175182
verified.

.crabbox.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ capacity:
66
strategy: most-available
77
fallback: on-demand-after-120s
88
hints: true
9+
availabilityZones:
10+
- eu-west-1a
11+
- eu-west-1b
12+
- eu-west-1c
913
regions:
1014
- eu-west-1
1115
- eu-west-2

.github/actions/setup-node-env/action.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ runs:
4040
id: pnpm-cache
4141
uses: ./.github/actions/setup-pnpm-store-cache
4242
with:
43+
node-version: ${{ inputs.node-version }}
4344
pnpm-version: ${{ inputs.pnpm-version }}
4445
cache-key-suffix: ${{ inputs.cache-key-suffix }}
4546

@@ -58,14 +59,15 @@ runs:
5859
if command -v bun &>/dev/null; then bun -v; fi
5960
6061
- name: Capture node path
61-
if: inputs.install-deps == 'true'
6262
shell: bash
6363
run: |
6464
node_bin="$(dirname "$(node -p 'process.execPath')")"
6565
if command -v cygpath >/dev/null 2>&1; then
6666
node_bin="$(cygpath -u "$node_bin")"
6767
fi
68+
# zizmor: ignore[github-env] node_bin comes from trusted actions/setup-node output in this composite action.
6869
echo "NODE_BIN=$node_bin" >> "$GITHUB_ENV"
70+
echo "$node_bin" >> "$GITHUB_PATH"
6971
7072
- name: Install dependencies
7173
if: inputs.install-deps == 'true'

.github/actions/setup-pnpm-store-cache/action.yml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ inputs:
55
description: pnpm version to activate via corepack.
66
required: false
77
default: "11.0.8"
8+
node-version:
9+
description: Expected Node.js version already installed by actions/setup-node.
10+
required: false
11+
default: "24.x"
812
cache-key-suffix:
913
description: Suffix appended to the cache key.
1014
required: false
@@ -41,12 +45,85 @@ runs:
4145
env:
4246
COREPACK_ENABLE_DOWNLOAD_PROMPT: "0"
4347
PNPM_VERSION: ${{ inputs.pnpm-version }}
48+
REQUESTED_NODE_VERSION: ${{ inputs.node-version }}
4449
run: |
4550
set -euo pipefail
4651
if [[ ! "$PNPM_VERSION" =~ ^[0-9]+(\.[0-9]+){1,2}([.-][0-9A-Za-z.-]+)?$ ]]; then
4752
echo "::error::Invalid pnpm-version input: '$PNPM_VERSION'"
4853
exit 2
4954
fi
55+
56+
requested_node="${REQUESTED_NODE_VERSION:-${NODE_VERSION:-}}"
57+
requested_node="${requested_node#v}"
58+
59+
node_version_matches() {
60+
local actual="$1"
61+
local requested="$2"
62+
if [[ -z "$requested" ]]; then
63+
return 0
64+
fi
65+
case "$requested" in
66+
*x)
67+
[[ "${actual%%.*}" == "${requested%%.*}" ]]
68+
;;
69+
*.*.*)
70+
[[ "$actual" == "$requested" ]]
71+
;;
72+
*.*)
73+
[[ "$actual" == "$requested".* ]]
74+
;;
75+
*)
76+
[[ "${actual%%.*}" == "$requested" ]]
77+
;;
78+
esac
79+
}
80+
81+
active_node_version="$(node -p 'process.versions.node' 2>/dev/null || true)"
82+
if ! node_version_matches "$active_node_version" "$requested_node"; then
83+
node_roots=()
84+
for root in \
85+
"${RUNNER_TOOL_CACHE:-}" \
86+
"${AGENT_TOOLSDIRECTORY:-}" \
87+
"${ACTIONS_RUNNER_TOOL_CACHE:-}" \
88+
"/opt/hostedtoolcache" \
89+
"/home/runner/_work/_tool" \
90+
"/Users/runner/hostedtoolcache" \
91+
"/c/hostedtoolcache/windows"
92+
do
93+
if [[ -d "$root/node" ]]; then
94+
node_roots+=("$root/node")
95+
elif [[ "$(basename "$root")" == "node" && -d "$root" ]]; then
96+
node_roots+=("$root")
97+
fi
98+
done
99+
100+
node_bin=""
101+
for node_root in "${node_roots[@]}"; do
102+
while IFS= read -r candidate; do
103+
candidate_version="$("$candidate" -p 'process.versions.node' 2>/dev/null || true)"
104+
if node_version_matches "$candidate_version" "$requested_node"; then
105+
node_bin="$candidate"
106+
break 2
107+
fi
108+
done < <(find "$node_root" \( -name node -o -name node.exe \) -type f 2>/dev/null | sort -r)
109+
done
110+
111+
if [[ -n "$node_bin" ]]; then
112+
echo "Using Node $("$node_bin" -p 'process.versions.node') from $node_bin"
113+
export PATH="$(dirname "$node_bin"):$PATH"
114+
hash -r
115+
fi
116+
fi
117+
118+
active_node_version="$(node -p 'process.versions.node' 2>/dev/null || true)"
119+
if ! node_version_matches "$active_node_version" "$requested_node"; then
120+
echo "::error::Expected Node '${requested_node}', but active node is '${active_node_version:-missing}' at $(command -v node || true)"
121+
exit 1
122+
fi
123+
124+
node -v
125+
command -v node
126+
command -v corepack
50127
corepack enable
51128
for attempt in 1 2 3; do
52129
if corepack prepare "pnpm@$PNPM_VERSION" --activate; then

.github/labeler.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,11 @@
286286
- changed-files:
287287
- any-glob-to-any-file:
288288
- "extensions/oc-path/**"
289+
"extensions: policy":
290+
- changed-files:
291+
- any-glob-to-any-file:
292+
- "extensions/policy/**"
293+
- "docs/cli/policy.md"
289294
"extensions: open-prose":
290295
- changed-files:
291296
- any-glob-to-any-file:

.github/workflows/crabbox-hydrate.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,20 @@ jobs:
6262
sudo ln -sf "$node_bin/corepack" /usr/local/bin/corepack
6363
sudo ln -sf "$pnpm_bin" /usr/local/bin/pnpm
6464
65-
- name: Ensure Docker is available
65+
- name: Ensure Docker is running
6666
shell: bash
6767
run: |
6868
set -euo pipefail
6969
7070
if ! command -v docker >/dev/null 2>&1; then
71+
echo "docker not found; installing fallback engine"
7172
curl -fsSL https://get.docker.com | sudo sh
7273
fi
7374
7475
if command -v systemctl >/dev/null 2>&1; then
75-
sudo systemctl start docker
76+
sudo systemctl start docker || true
77+
elif command -v service >/dev/null 2>&1; then
78+
sudo service docker start || true
7679
fi
7780
7881
if [ -S /var/run/docker.sock ]; then
@@ -82,6 +85,10 @@ jobs:
8285
sudo chmod 666 /var/run/docker.sock
8386
fi
8487
88+
docker version
89+
docker buildx version || true
90+
docker compose version || true
91+
8592
- name: Hydrate provider env helper
8693
shell: bash
8794
env:

0 commit comments

Comments
 (0)