Skip to content

Commit f811323

Browse files
authored
Merge branch 'openclaw:main' into main
2 parents 062133c + c2fb7f1 commit f811323

1,543 files changed

Lines changed: 70270 additions & 26459 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/openclaw-parallels-smoke/SKILL.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,30 @@ Use this skill for Parallels guest workflows and smoke interpretation. Do not lo
1616
- Pass `--json` for machine-readable summaries.
1717
- Per-phase logs land under `/tmp/openclaw-parallels-*`.
1818
- Do not run local and gateway agent turns in parallel on the same fresh workspace or session.
19+
- For `prlctl exec`, pass the VM name before `--current-user` (`prlctl exec "$VM" --current-user ...`), not the other way around.
20+
21+
## npm install then update
22+
23+
- Preferred entrypoint: `pnpm test:parallels:npm-update`
24+
- Flow: fresh snapshot -> install npm package baseline -> smoke -> install current main tgz on the same guest -> smoke again.
25+
- Same-guest update verification should set the default model explicitly to `openai/gpt-5.4` before the agent turn and use a fresh explicit `--session-id` so old session model state does not leak into the check.
26+
- The aggregate npm-update wrapper must resolve the Linux VM with the same Ubuntu fallback policy as `parallels-linux-smoke.sh` before both fresh and update lanes. On Peter's current host, missing `Ubuntu 24.04.3 ARM64` should fall back to `Ubuntu 25.10`.
27+
- On Windows same-guest update checks, restart the gateway after the npm upgrade before `gateway status` / `agent`; in-place global npm updates can otherwise leave stale hashed `dist/*` module imports alive in the running service.
28+
- For Windows same-guest update checks, prefer the done-file/log-drain PowerShell runner pattern over one long-lived `prlctl exec ... powershell -EncodedCommand ...` transport. The guest can finish successfully while the outer `prlctl exec` still hangs.
29+
- Linux same-guest update verification should also export `HOME=/root`, pass `OPENAI_API_KEY` via `prlctl exec ... /usr/bin/env`, and use `openclaw agent --local`; the fresh Linux baseline does not rely on persisted gateway credentials.
30+
31+
## CLI invocation footgun
32+
33+
- The Parallels smoke shell scripts should tolerate a literal bare `--` arg so `pnpm test:parallels:* -- --json` and similar forwarded invocations work without needing to call `bash scripts/e2e/...` directly.
1934

2035
## macOS flow
2136

2237
- Preferred entrypoint: `pnpm test:parallels:macos`
2338
- Default to the snapshot closest to `macOS 26.3.1 latest`.
2439
- On Peter's Tahoe VM, `fresh-latest-march-2026` can hang in `prlctl snapshot-switch`; if restore times out there, rerun with `--snapshot-hint 'macOS 26.3.1 latest'` before blaming auth or the harness.
40+
- The macOS smoke should include a dashboard load phase after gateway health: resolve the tokenized URL with `openclaw dashboard --no-open`, verify the served HTML contains the Control UI title/root shell, then open Safari and require an established localhost TCP connection from Safari to the gateway port.
2541
- `prlctl exec` is fine for deterministic repo commands, but use the guest Terminal or `prlctl enter` when installer parity or shell-sensitive behavior matters.
42+
- Multi-word `openclaw agent --message ...` checks should go through a guest shell wrapper (`guest_current_user_sh` / `guest_current_user_cli` or `/bin/sh -lc ...`), not raw `prlctl exec ... node openclaw.mjs ...`, or the message can be split into extra argv tokens and Commander reports `too many arguments for 'agent'`.
2643
- On the fresh Tahoe snapshot, `brew` exists but `node` may be missing from PATH in noninteractive exec. Use `/opt/homebrew/bin/node` when needed.
2744
- Fresh host-served tgz installs should install as guest root with `HOME=/var/root`, then run onboarding as the desktop user via `prlctl exec --current-user`.
2845
- Root-installed tgz smoke can log plugin blocks for world-writable `extensions/*`; do not treat that as an onboarding or gateway failure unless plugin loading is the task.
@@ -34,7 +51,11 @@ Use this skill for Parallels guest workflows and smoke interpretation. Do not lo
3451
- Always use `prlctl exec --current-user`; plain `prlctl exec` lands in `NT AUTHORITY\\SYSTEM`.
3552
- Prefer explicit `npm.cmd` and `openclaw.cmd`.
3653
- Use PowerShell only as the transport with `-ExecutionPolicy Bypass`, then call the `.cmd` shims from inside it.
54+
- Multi-word `openclaw agent --message ...` checks should call `& $openclaw ...` inside PowerShell, not `Start-Process ... -ArgumentList` against `openclaw.cmd`, or Commander can see split argv and throw `too many arguments for 'agent'`.
55+
- Windows installer/tgz phases now retry once after guest-ready recheck; keep new Windows smoke steps idempotent so a transport-flake retry is safe.
56+
- Windows global `npm install -g` phases can stay quiet for a minute or more even when healthy; inspect the phase log before calling it hung, and only treat it as a regression once the retry wrapper or timeout trips.
3757
- Keep onboarding and status output ASCII-clean in logs; fancy punctuation becomes mojibake in current capture paths.
58+
- If you hit an older run with `rc=255` plus an empty `fresh.install-main.log` or `upgrade.install-main.log`, treat it as a likely `prlctl exec` transport drop after guest start-up, not immediate proof of an npm/package failure.
3859

3960
## Linux flow
4061

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

Lines changed: 167 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ Use this skill for release and publish-time workflow. Keep ordinary development
1111

1212
- Do not change version numbers without explicit operator approval.
1313
- Ask permission before any npm publish or release step.
14-
- Use the private maintainer release docs for the actual runbook and `docs/reference/RELEASING.md` for public policy.
14+
- This skill should be sufficient to drive the normal release flow end-to-end.
15+
- Use the private maintainer release docs for credentials, recovery steps, and mac signing/notary specifics, and use `docs/reference/RELEASING.md` for public policy.
16+
- Core `openclaw` publish is manual `workflow_dispatch`; creating or pushing a tag does not publish by itself.
1517

1618
## Keep release channel naming aligned
1719

@@ -31,8 +33,19 @@ Use this skill for release and publish-time workflow. Keep ordinary development
3133
- `apps/macos/Sources/OpenClaw/Resources/Info.plist`
3234
- `docs/install/updating.md`
3335
- Peekaboo Xcode project and plist version fields
36+
- Before creating a release tag, make every version location above match the version encoded by that tag.
37+
- For fallback correction tags like `vYYYY.M.D-N`, the repo version locations still stay at `YYYY.M.D`.
3438
- “Bump version everywhere” means all version locations above except `appcast.xml`.
3539
- Release signing and notary credentials live outside the repo in the private maintainer docs.
40+
- Every OpenClaw release ships the npm package and macOS app together.
41+
- The production Sparkle feed lives at `https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml`, and the canonical published file is `appcast.xml` on `main` in the `openclaw` repo.
42+
- That shared production Sparkle feed is stable-only. Beta mac releases may
43+
upload assets to the GitHub prerelease, but they must not replace the shared
44+
`appcast.xml` unless a separate beta feed exists.
45+
- For fallback correction tags like `vYYYY.M.D-N`, the repo version still stays
46+
at `YYYY.M.D`, but the mac release must use a strictly higher numeric
47+
`APP_BUILD` / Sparkle build than the original release so existing installs
48+
see it as newer.
3649

3750
## Build changelog-backed release notes
3851

@@ -59,16 +72,166 @@ pnpm test:install:smoke
5972
For a non-root smoke path:
6073

6174
```bash
62-
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke
75+
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke
6376
```
6477

78+
After npm publish, run:
79+
80+
```bash
81+
node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
82+
```
83+
84+
- This verifies the published registry install path in a fresh temp prefix.
85+
- For stable correction releases like `YYYY.M.D-N`, it also verifies the
86+
upgrade path from `YYYY.M.D` to `YYYY.M.D-N` so a correction publish cannot
87+
silently leave existing global installs on the old base stable payload.
88+
89+
## Check all relevant release builds
90+
91+
- Always validate the OpenClaw npm release path before creating the tag.
92+
- Default release checks:
93+
- `pnpm check`
94+
- `pnpm build`
95+
- `node --import tsx scripts/release-check.ts`
96+
- `pnpm release:check`
97+
- `OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke`
98+
- Check all release-related build surfaces touched by the release, not only the npm package.
99+
- Include mac release readiness in preflight by running the public validation
100+
workflow in `openclaw/openclaw` and the real mac preflight in
101+
`openclaw/releases-private` for every release.
102+
- Treat the `appcast.xml` update on `main` as part of mac release readiness, not an optional follow-up.
103+
- The workflows remain tag-based. The agent is responsible for making sure
104+
preflight runs complete successfully before any publish run starts.
105+
- Any fix after preflight means a new commit. Delete and recreate the tag and
106+
matching GitHub release from the fixed commit, then rerun preflight from
107+
scratch before publishing.
108+
- For stable mac releases, generate the signed `appcast.xml` before uploading
109+
public release assets so the updater feed cannot lag the published binaries.
110+
- Serialize stable appcast-producing runs across tags so two releases do not
111+
generate replacement `appcast.xml` files from the same stale seed.
112+
- For stable releases, confirm the latest beta already passed the broader release workflows before cutting stable.
113+
- If any required build, packaging step, or release workflow is red, do not say the release is ready.
114+
65115
## Use the right auth flow
66116

67-
- Core `openclaw` publish uses GitHub trusted publishing.
68-
- Do not use `NPM_TOKEN` or the plugin OTP flow for core releases.
117+
- OpenClaw publish uses GitHub trusted publishing.
118+
- The publish run must be started manually with `workflow_dispatch`.
119+
- The npm workflow and the private mac publish workflow accept
120+
`preflight_only=true` to run validation/build/package steps without uploading
121+
public release assets.
122+
- The private mac workflow also accepts `smoke_test_only=true` for branch-safe
123+
workflow smoke tests that use ad-hoc signing, skip notarization, skip shared
124+
appcast generation, and do not prove release readiness.
125+
- `preflight_only=true` on the npm workflow is also the right way to validate an
126+
existing tag after publish; it should keep running the build checks even when
127+
the npm version is already published.
128+
- Validation-only runs may be dispatched from a branch when you are testing a
129+
workflow change before merge.
130+
- `.github/workflows/macos-release.yml` in `openclaw/openclaw` is now a
131+
public validation-only handoff. It validates the tag/release state and points
132+
operators to the private repo; it does not build or publish macOS artifacts.
133+
- Real mac preflight and real mac publish both use
134+
`openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml`.
135+
- The private mac workflow runs on GitHub's xlarge macOS runner and uses a
136+
SwiftPM cache because the Swift build/test/package path is CPU-heavy.
137+
- Private mac preflight uploads notarized build artifacts as workflow artifacts
138+
instead of uploading public GitHub release assets.
139+
- Private smoke-test runs upload ad-hoc, non-notarized build artifacts as
140+
workflow artifacts and intentionally skip stable `appcast.xml` generation.
141+
- npm preflight, public mac validation, and private mac preflight must all pass
142+
before any real publish run starts.
143+
- Real publish runs must be dispatched from `main`; branch-dispatched publish
144+
attempts should fail before the protected environment is reached.
145+
- The release workflows stay tag-based; rely on the documented release sequence
146+
rather than workflow-level SHA pinning.
147+
- The `npm-release` environment must be approved by `@openclaw/openclaw-release-managers` before publish continues.
148+
- Mac publish uses
149+
`openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml` for
150+
build, signing, notarization, packaged mac artifact generation, and
151+
stable-feed `appcast.xml` artifact generation.
152+
- Real private mac publish uploads the packaged `.zip`, `.dmg`, and
153+
`.dSYM.zip` assets to the existing GitHub release in `openclaw/openclaw`
154+
automatically when `OPENCLAW_PUBLIC_REPO_RELEASE_TOKEN` is present in the
155+
private repo `mac-release` environment.
156+
- For stable releases, the agent must also download the signed
157+
`macos-appcast-<tag>` artifact from the successful private mac workflow and
158+
then update `appcast.xml` on `main`.
159+
- For beta mac releases, do not update the shared production `appcast.xml`
160+
unless a separate beta Sparkle feed exists.
161+
- The private repo targets a dedicated `mac-release` environment. If the GitHub
162+
plan does not yet support required reviewers there, do not assume the
163+
environment alone is the approval boundary; rely on private repo access and
164+
CODEOWNERS until those settings can be enabled.
165+
- Do not use `NPM_TOKEN` or the plugin OTP flow for OpenClaw releases.
69166
- `@openclaw/*` plugin publishes use a separate maintainer-only flow.
70167
- Only publish plugins that already exist on npm; bundled disk-tree-only plugins stay unpublished.
71168

169+
## Fallback local mac publish
170+
171+
- Keep the original local macOS publish workflow available as a fallback in case
172+
CI/CD mac publishing is unavailable or broken.
173+
- Preserve the existing maintainer workflow Peter uses: run it on a real Mac
174+
with local signing, notary, and Sparkle credentials already configured.
175+
- Follow the private maintainer macOS runbook for the local steps:
176+
`scripts/package-mac-dist.sh` to build, sign, notarize, and package the app;
177+
manual GitHub release asset upload; then `scripts/make_appcast.sh` plus the
178+
`appcast.xml` commit to `main`.
179+
- `scripts/package-mac-dist.sh` now fails closed for release builds if the
180+
bundled app comes out with a debug bundle id, an empty Sparkle feed URL, or a
181+
`CFBundleVersion` below the canonical Sparkle build floor for that short
182+
version. For correction tags, set a higher explicit `APP_BUILD`.
183+
- `scripts/make_appcast.sh` first uses `generate_appcast` from `PATH`, then
184+
falls back to the SwiftPM Sparkle tool output under `apps/macos/.build`.
185+
- For stable tags, the local fallback may update the shared production
186+
`appcast.xml`.
187+
- For beta tags, the local fallback still publishes the mac assets but must not
188+
update the shared production `appcast.xml` unless a separate beta feed exists.
189+
- Treat the local workflow as fallback only. Prefer the CI/CD publish workflow
190+
when it is working.
191+
- After any stable mac publish, verify all of the following before you call the
192+
release finished:
193+
- the GitHub release has `.zip`, `.dmg`, and `.dSYM.zip` assets
194+
- `appcast.xml` on `main` points at the new stable zip
195+
- the packaged app reports the expected short version and a numeric
196+
`CFBundleVersion` at or above the canonical Sparkle build floor
197+
198+
## Run the release sequence
199+
200+
1. Confirm the operator explicitly wants to cut a release.
201+
2. Choose the exact target version and git tag.
202+
3. Make every repo version location match that tag before creating it.
203+
4. Update `CHANGELOG.md` and assemble the matching GitHub release notes.
204+
5. Run the full preflight for all relevant release builds, including mac readiness.
205+
6. Confirm the target npm version is not already published.
206+
7. Create and push the git tag.
207+
8. Create or refresh the matching GitHub release.
208+
9. Start `.github/workflows/openclaw-npm-release.yml` with `preflight_only=true`
209+
and wait for it to pass.
210+
10. Start `.github/workflows/macos-release.yml` in `openclaw/openclaw` and wait
211+
for the public validation-only run to pass.
212+
11. Start
213+
`openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml`
214+
with `preflight_only=true` and wait for it to pass.
215+
12. If any preflight or validation run fails, fix the issue on a new commit,
216+
delete the tag and matching GitHub release, recreate them from the fixed
217+
commit, and rerun all relevant preflights from scratch before continuing.
218+
Never reuse old preflight results after the commit changes.
219+
13. Start `.github/workflows/openclaw-npm-release.yml` with the same tag for
220+
the real publish.
221+
14. Wait for `npm-release` approval from `@openclaw/openclaw-release-managers`.
222+
15. Start
223+
`openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml`
224+
for the real publish and wait for success.
225+
16. Verify the successful real private mac run uploaded the `.zip`, `.dmg`,
226+
and `.dSYM.zip` artifacts to the existing GitHub release in
227+
`openclaw/openclaw`.
228+
17. For stable releases, download `macos-appcast-<tag>` from the successful
229+
private mac run, update `appcast.xml` on `main`, and verify the feed.
230+
18. For beta releases, publish the mac assets but expect no shared production
231+
`appcast.xml` artifact and do not update the shared production feed unless a
232+
separate beta feed exists.
233+
19. After publish, verify npm and the attached release artifacts.
234+
72235
## GHSA advisory work
73236

74237
- Use `openclaw-ghsa-maintainer` for GHSA advisory inspection, patch/publish flow, private-fork validation, and GHSA API-specific publish checks.

.github/actions/ensure-base-commit/action.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,24 @@ runs:
2323
exit 0
2424
fi
2525
26+
if ! [[ "$BASE_SHA" =~ ^[0-9a-fA-F]{7,40}$ ]]; then
27+
echo "::error title=ensure-base-commit invalid base sha::Refusing invalid base SHA: $BASE_SHA"
28+
exit 2
29+
fi
30+
31+
if ! git check-ref-format --branch "$FETCH_REF" >/dev/null 2>&1; then
32+
echo "::error title=ensure-base-commit invalid fetch ref::Refusing invalid fetch ref: $FETCH_REF"
33+
exit 2
34+
fi
35+
2636
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
2737
echo "Base commit already present: $BASE_SHA"
2838
exit 0
2939
fi
3040
3141
for deepen_by in 25 100 300; do
3242
echo "Base commit missing; deepening $FETCH_REF by $deepen_by."
33-
if ! git fetch --no-tags --deepen="$deepen_by" origin "$FETCH_REF"; then
43+
if ! git fetch --no-tags --deepen="$deepen_by" origin -- "$FETCH_REF"; then
3444
echo "::warning title=ensure-base-commit fetch failed::Failed to deepen $FETCH_REF by $deepen_by while looking for $BASE_SHA"
3545
fi
3646
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then
@@ -40,7 +50,7 @@ runs:
4050
done
4151
4252
echo "Base commit still missing; fetching full history for $FETCH_REF."
43-
if ! git fetch --no-tags origin "$FETCH_REF"; then
53+
if ! git fetch --no-tags origin -- "$FETCH_REF"; then
4454
echo "::warning title=ensure-base-commit fetch failed::Failed to fetch full history for $FETCH_REF while looking for $BASE_SHA"
4555
fi
4656
if git rev-parse --verify "$BASE_SHA^{commit}" >/dev/null 2>&1; then

.github/labeler.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@
241241
- changed-files:
242242
- any-glob-to-any-file:
243243
- "extensions/byteplus/**"
244+
"extensions: deepseek":
245+
- changed-files:
246+
- any-glob-to-any-file:
247+
- "extensions/deepseek/**"
244248
"extensions: anthropic":
245249
- changed-files:
246250
- any-glob-to-any-file:

.github/pull_request_template.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,32 @@ Describe the problem and fix in 2–5 bullets:
3131

3232
- Closes #
3333
- Related #
34+
- [ ] This PR fixes a bug or regression
35+
36+
## Root Cause / Regression History (if applicable)
37+
38+
For bug fixes or regressions, explain why this happened, not just what changed. Otherwise write `N/A`. If the cause is unclear, write `Unknown`.
39+
40+
- Root cause:
41+
- Missing detection / guardrail:
42+
- Prior context (`git blame`, prior PR, issue, or refactor if known):
43+
- Why this regressed now:
44+
- If unknown, what was ruled out:
45+
46+
## Regression Test Plan (if applicable)
47+
48+
For bug fixes or regressions, name the smallest reliable test coverage that should have caught this. Otherwise write `N/A`.
49+
50+
- Coverage level that should have caught this:
51+
- [ ] Unit test
52+
- [ ] Seam / integration test
53+
- [ ] End-to-end test
54+
- [ ] Existing coverage already sufficient
55+
- Target test or file:
56+
- Scenario the test should lock in:
57+
- Why this is the smallest reliable guardrail:
58+
- Existing test that already covers this (if any):
59+
- If no new test is added, why not:
3460

3561
## User-visible / Behavior Changes
3662

.github/workflows/auto-response.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ on:
1111
env:
1212
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
1313

14+
concurrency:
15+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref || github.run_id }}
16+
cancel-in-progress: ${{ github.event_name == 'pull_request_target' }}
17+
1418
permissions: {}
1519

1620
jobs:

0 commit comments

Comments
 (0)