























@@ -0,0 +1,234 @@
1+---
2+name: openclaw-pre-release-plugin-testing
3+description: Plan and run pre-release OpenClaw plugin validation across bundled plugins, package artifacts, lifecycle commands, doctor/fix, config round-trip, gateway startup, SDK compatibility, Docker E2E, Package Acceptance, and Testbox proof.
4+---
5+6+# OpenClaw Pre-Release Plugin Testing
7+8+Use this skill when Vincent asks for plugin release confidence, plugin lifecycle
9+sweeps, package-artifact plugin proof, or "what else should we test before
10+release?" It complements `openclaw-testing`; use that skill too when choosing
11+the cheapest safe runner or debugging a failing lane.
12+13+## Goal
14+15+Prove the plugin system as a product surface, not just as source tests:
16+17+- bundled plugin lifecycle: install, inspect, enable, disable, uninstall
18+- package artifact behavior from a clean `HOME`
19+- doctor/fix/config validation and idempotence
20+- config discovery and config round-trip
21+- status/log visibility and diagnostics
22+- gateway startup/bootstrap with plugin metadata snapshots
23+- public SDK compatibility for real external plugins
24+- live-ish provider/channel probes only when safe credentials exist
25+26+## First Checks
27+28+From the OpenClaw repo root:
29+30+```bash
31+pnpm docs:list
32+git status --short --branch
33+readlink node_modules
34+pnpm changed:lanes --json
35+```
36+37+In Codex worktrees under `.codex/worktrees`, `node_modules` must be a symlink to
38+the main OpenClaw checkout. Do not run `pnpm install` there. For broad or
39+package-heavy proof, use Blacksmith Testbox or GitHub Actions.
40+41+## Runner Choice
42+43+Prefer this order:
44+45+1. **GitHub Package Acceptance** for installable-package product proof.
46+2. **`ci-build-artifacts-testbox.yml` Testbox** when Docker/package lanes need
47+ seeded `dist`, `dist-runtime`, and package caches.
48+3. **`ci-check-testbox.yml` Testbox** for source checks, targeted Vitest,
49+ package-boundary checks, or focused Docker lanes.
50+4. **Local targeted commands only** for small format/static/unit probes.
51+52+Avoid long package Docker runs from a stale sparse worktree. If Testbox sync
53+reports hundreds of changed files or starts deleting package inputs, stop and
54+warm a fresh box from current `main`, or switch to Package Acceptance.
55+56+## Existing Baseline
57+58+Run or verify these before inventing new coverage:
59+60+```bash
61+OPENCLAW_TESTBOX=1 pnpm check:changed
62+pnpm run test:extensions:package-boundary:canary
63+pnpm run test:extensions:package-boundary:compile
64+pnpm test:docker:plugins
65+OPENCLAW_PLUGINS_E2E_CLAWHUB=0 pnpm test:docker:plugins
66+pnpm test:docker:plugin-update
67+pnpm test:docker:bundled-channel-deps:fast
68+```
69+70+For full bundled install/uninstall proof, shard the packaged sweep:
71+72+```bash
73+OPENCLAW_BUNDLED_PLUGIN_SWEEP_TOTAL=8 \
74+OPENCLAW_BUNDLED_PLUGIN_SWEEP_INDEX=<0-7> \
75+pnpm test:docker:bundled-plugin-install-uninstall
76+```
77+78+Expected current packaged scope: 116 public bundled plugins over shards `0-7`.
79+Private QA plugins are source-mode only unless a package explicitly includes
80+them.
81+82+## Confidence Matrix
83+84+Use this matrix for pre-release signoff. Record pass/fail, run URL/Testbox ID,
85+package SHA/version, and skipped-live reason.
86+87+| Surface | Proof | Preferred runner |
88+| --- | --- | --- |
89+| Package artifact | Package Acceptance `suite_profile=package` or custom lanes | GitHub Actions |
90+| Bundled lifecycle | 8-shard `test:docker:bundled-plugin-install-uninstall` | Testbox or release Docker |
91+| External plugins | `test:docker:plugins` and `plugins-offline` | Testbox/package acceptance |
92+| Update no-op | `test:docker:plugin-update` | Testbox/package acceptance |
93+| Channel runtime deps | `test:docker:bundled-channel-deps:fast` plus key channels | Testbox/package acceptance |
94+| Doctor/fix | seeded bad configs + `doctor --fix --non-interactive` | new Docker/Testbox harness |
95+| Config round-trip | `config set/get`, inspect, doctor, reload, diff hash | new Docker/Testbox harness |
96+| Gateway bootstrap | clean `HOME`, plugin groups enabled/disabled, status JSON | new Docker/Testbox harness |
97+| SDK compatibility | directory, tgz, and `file:` external plugins using SDK subpaths | `test:docker:plugins` plus new smoke |
98+| Live-ish | redacted provider/channel probes only for present env | Testbox live lanes |
99+100+## Package Acceptance Plan
101+102+Use this when validating a release branch, beta, or candidate package:
103+104+```bash
105+gh workflow run package-acceptance.yml \
106+ --repo openclaw/openclaw \
107+ --ref main \
108+ -f workflow_ref=main \
109+ -f source=ref \
110+ -f package_ref=<branch-or-sha> \
111+ -f suite_profile=custom \
112+ -f docker_lanes='plugins-offline plugin-update bundled-channel-deps-compat doctor-switch update-channel-switch config-reload mcp-channels npm-onboard-channel-agent' \
113+ -f telegram_mode=mock-openai
114+```
115+116+Use `source=npm -f package_spec=openclaw@beta` for published beta proof. Keep
117+`workflow_ref` as trusted current harness code unless the release process says
118+otherwise.
119+120+## New Testbox Harness Plan
121+122+If more certainty is needed, add or run a `plugin-lifecycle-matrix` Docker lane
123+that uses one package tarball and sharded plugin lists. Per plugin:
124+125+1. Start with a clean `HOME`.
126+2. Capture `plugins list --json`.
127+3. `plugins install <id>`.
128+4. `plugins inspect <id> --json`.
129+5. `plugins disable <id>`, then assert disabled visibility.
130+6. `plugins enable <id>`, except config-required plugins without config.
131+7. `plugins registry --refresh`.
132+8. `doctor --non-interactive`.
133+9. `plugins uninstall <id> --force`.
134+10. Assert no config entry, allow/deny residue, install record, managed dir, or
135+ bundled `dist/extensions/...` load path remains.
136+11. Assert diagnostics contain no `level: "error"` and output redacts
137+ secret-looking values.
138+139+Keep `memory-lancedb` special: it is config-required. First assert install does
140+not enable it without embedding config, then run a second configured case.
141+142+## Doctor/Fix Matrix
143+144+Seed bad states and require `doctor --fix --non-interactive` to repair them,
145+then run doctor again and require idempotence:
146+147+- stale `plugins.allow`
148+- stale `plugins.entries`
149+- stale channel config for missing channel plugin
150+- invalid `plugins.entries.<id>.config`
151+- packaged bundled path in `plugins.load.paths`
152+- legacy `plugins.installs`
153+- disabled channel/plugin config that must not stage runtime deps
154+- root-owned global package tree that must remain unmodified
155+156+## Gateway Bootstrap Matrix
157+158+Start packaged OpenClaw in Docker with clean state:
159+160+- provider plugins enabled, no credentials: ready with warnings, no crash
161+- channel plugins configured disabled: no runtime deps staged
162+- startup-activation plugins enabled: ready and reflected in status
163+- invalid single plugin config: bad plugin skipped/quarantined, others remain
164+165+Assert:
166+167+- gateway reaches ready
168+- `openclaw status --json` includes plugin diagnostics
169+- `openclaw plugins inspect --all --json` is parseable
170+- package tree is not mutated
171+- logs contain no raw tokens
172+173+## Config Round-Trip Representatives
174+175+Use representative plugin families instead of every plugin for deep config
176+round-trip:
177+178+- providers: `openai`, `anthropic`, `mistral`, `openrouter`
179+- channels: `telegram`, `discord`, `slack`, `whatsapp`
180+- memory: `memory-lancedb`
181+- feature/runtime: `browser`, `acpx`, `tokenjuice`
182+183+For each representative:
184+185+1. Write config through CLI when possible.
186+2. Read it back through `config get` or JSON.
187+3. Run `plugins inspect`.
188+4. Run `doctor --non-interactive`.
189+5. Trigger gateway config reload if applicable.
190+6. Compare config hash before/after no-op commands.
191+192+## External SDK Smoke
193+194+In a package Docker lane, create tiny external plugins and install them from:
195+196+- local directory
197+- `.tgz`
198+- `file:` npm spec
199+200+Cover CJS and ESM shapes, plus at least one plugin importing focused
201+`openclaw/plugin-sdk/*` subpaths. Assert `plugins inspect` sees its tool,
202+gateway method, CLI command, or service.
203+204+## Live-Ish Probe Rules
205+206+Before live-ish work, source allowed env in Testbox and generate a redacted
207+availability matrix: present/missing only, never values.
208+209+Only run probes for credentials that exist. Prefer auth/catalog/status probes
210+over sending user-visible messages. If a probe might contact an external user,
211+channel, or workspace, stop and ask Vincent.
212+213+## Reporting
214+215+Report in this shape:
216+217+```text
218+package/ref:
219+tbx ids / run urls:
220+matrix:
221+ bundled lifecycle:
222+ package acceptance:
223+ doctor/fix:
224+ gateway bootstrap:
225+ config round-trip:
226+ sdk external:
227+ live-ish:
228+failures:
229+skips:
230+next highest-value gap:
231+```
232+233+Say clearly when a failure is Testbox sync/env damage rather than product
234+behavior, and prove that with a clean rerun or current-main comparison.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。