The wizard's applyAuthChoice call dropped provider-specific flag values
like --openai-api-key, only forwarding token/tokenProvider. As a result,
maybeApplyApiKeyFromOption could not honor the flag and onboarding still
prompted "Use existing OPENAI_API_KEY?" when the operator already
passed --openai-api-key alongside an existing env var (e.g. onboard-fast
harnesses that pre-seed --openai-api-key "$OPENAI_API_KEY").
Spread opts into the inner opts bag so provider-specific flag values
reach the provider auth method via ctx.opts. When no flag is passed the
env-confirm prompt still fires unchanged.
Restructure the migrate codex CLI output:
- Split into separate Before (preview) and After (result) messages
so each can be tuned independently. Both render through clack's
log.message so they pick up the standard '|' gutter.
- Group items by kind (Skills, Plugins, Memory, Secrets, Archive,
Manual review, Other) instead of one flat list. Hide config items
from display and exclude them from the summary count.
- Drop the internal kind/action tag (e.g. 'manual/manual'), strip
'<kind>:' id prefixes and trailing ':N' disambiguators, and use
'•' for bullets.
- Mute parenthetical action text.
- In result mode: replace status text with emoji (✅ migrated,
❌ error, ⏭️ skipped, ⚠️ conflict), show '(Migrated)' on success,
show humanized failure reasons for known codes (plugin_missing,
marketplace_missing, etc.), say '(Skipped)' for user-deselected
skill/plugin items but keep the real message on manual-review
skips. Drop warnings from the result message.
- In preview mode: omit the 'Next' section and move warnings to
the bottom. Use generic action descriptions ('Copy Codex skill
into OpenClaw', 'Install Codex plugin into OpenClaw').
- Drop the redundant 'Codex cached plugin bundles remain
manual-review only.' warning — covered by the source-installed
warning above it.
Two related improvements to the interactive `openclaw migrate <provider>`
flow, both surfaced by the onboarding post-install migration prompt that
landed in #81192.
1. `suppressPlanLog?: boolean` on `MigrateCommonOptions`
(`src/commands/migrate/types.ts`). When set, `migratePlanCommand`
skips the up-front `runtime.log(formatMigrationPlan(plan))` dump.
The interactive Codex selection picker and the "Apply this migration
now?" confirm still run. Wired from the wizard helper at
`src/wizard/setup.post-install-migration.ts` so that path no longer
shows the plan dump after the user has already confirmed at the
wizard prompt.
2. New "Accept recommended" sentinel row at the top of both Codex
selection pickers, with "Toggle all on" and "Toggle all off" moved
to the bottom. The cursor starts on "Accept recommended" so pressing
Enter at the default position submits the picker's `initialValues`
(the recommended set) — matching the visual state of the checkboxes.
Implemented in `skill-selection-prompt.ts`:
- Enter on the Accept sentinel sets `prompt.value` to
`opts.initialValues` and lets clack submit.
- Space on the Accept sentinel snaps `prompt.value` to
`opts.initialValues` so the visible checkboxes flip to the
recommended state. The user can then Enter to commit or continue
toggling individual rows. The Accept row itself is never persisted
in the submitted value list.
The existing Enter handler for "Toggle all on" / "Toggle all off"
stays unchanged.
3. Removed the "Skip for now" sentinel entirely. It was a single-
keystroke trap: with the picker cursor wrapping from Accept to Skip
via up-arrow (or via accidental down-arrows), Enter on Skip wiped
`prompt.value` to `[MIGRATION_SELECTION_SKIP]` and abandoned the
whole migration — including any items the user had already
confirmed in the previous picker. To exit without migrating, users
now navigate to "Toggle all off" (or use the `a` / `i` keyboard
shortcuts) to clear the selection; the apply phase then sees no
planned work and skips itself via the existing
`shouldSkipCodexApplyAfterInteractiveSelection` path.
Cleanup spans `migrate/selection.ts` (constants, `{ action: "skip" }`
variant, and the reconcile/resolve SKIP branches),
`migrate.ts` (the picker option rows and the
`if (selection.action === "skip")` handler blocks in both pickers),
and the corresponding tests.
4. Plugin selection hint relabelled from "Activate every recommended
plugin" to "Migrate every recommended plugin" so it matches the
skill hint and the prompt's own verb ("Migrate ... into this agent
now?").
Tests:
- `src/commands/migrate/skill-selection-prompt.test.ts` — Accept
sentinel cases (Enter and Space + Enter both submit initialValues);
Skip-related test removed; Skip row dropped from the picker fixture.
- `src/commands/migrate/selection.test.ts` — Skip-related sub-
assertions trimmed from the resolve/reconcile tests; the
"skip + toggle-off precedence" test renamed to "toggle-off precedence
over toggle-on" and Skip cases removed.
- `src/commands/migrate.test.ts` — four Skip-driven scenarios removed
(plugin-only skip, both-pickers skip, skip-skills-continue-to-plugins,
Codex subscription warning + skip).
- `src/wizard/setup.post-install-migration.test.ts` — call-args
assertion expects the new `suppressPlanLog` option.
Verification:
- `pnpm lint` clean
- `pnpm tsgo:core` + `pnpm tsgo:core:test` clean
- Touched test suites green (migrate 32/32, selection 17/17,
skill-selection-prompt 6/6, setup.post-install-migration 10/10).
Add a post-install seam so the wizard can prompt the user to import their
existing Codex CLI state (skills, archived config/hooks, advisory cached
plugins) through the existing `openclaw migrate codex` flow once the
harness plugin is in place. Fires on both fresh installs and repair runs;
the user can decline at any time.
Trigger sites, both routing through one helper:
- src/plugins/provider-auth-choice.ts: after
`ensureCodexRuntimePluginForModelSelection` reports `installed: true`,
dynamically import `offerPostInstallMigrations` and call it before the
wizard moves on.
- src/commands/onboard-non-interactive/local/auth-choice.plugin-providers.ts:
same call shape with `nonInteractive: true`, so the helper emits a hint
line only and never mutates state.
Helper (src/wizard/setup.post-install-migration.ts) is generic, not
Codex-hardcoded — it resolves migration providers via the manifest
`migrationProviders` contract, filters to providers owned by plugins the
caller flags as installed in this onboarding step, runs `provider.detect`,
and on TTY hands accepted runs to `migrateDefaultCommand`. All detect,
prompt, and migrate failures are swallowed so onboarding never aborts on
this optional offer.
Also harden the Codex app-server subprocess lifecycle now that `detect()`
runs from a hotter onboarding path: isolate the plugin-install
`plugin/read` call (extensions/codex/src/migration/apply.ts) and have the
isolated request wait for child exit with a SIGKILL fallback
(extensions/codex/src/app-server/request.ts) so parents are not held open
by an orphaned codex binary.
Tests:
- src/wizard/setup.post-install-migration.test.ts (new, 10 cases)
- src/commands/onboard-non-interactive/local/auth-choice.plugin-providers.test.ts
extended with hint-call assertions and a not-required-no-offer case.
Summary:
- The PR adds `sensitive` support to wizard text prompts, routes sensitive Clack prompts through `password()`, ... preserves existing gateway secrets through masked-preview confirms, and adds tests plus a changelog entry.
- Reproducibility: yes. Source inspection shows current main routes onboarding credential entry through visibl ... y provides a concrete Windows PowerShell `openclaw onboard --install-daemon` reproduction with screenshots.
Automerge notes:
- No ClawSweeper repair was needed after automerge opt-in.
Validation:
- ClawSweeper review passed for head a3db64c265.
- Required merge gates passed before the squash merge.
Prepared head SHA: a3db64c265
Review: https://github.com/openclaw/openclaw/pull/76693#issuecomment-4366253531
Co-authored-by: anurag-bg-neu <bheemappagnanamurt.a@northeastern.edu>
Reuse the startup runtime plugin registry across provider/tool helper paths while preserving standalone CLI/MCP fallback loading.
Includes follow-up fixes for migration/provider/tool registry bootstrap and regression coverage for compatible registry reuse.
Co-authored-by: DmitryPogodaev <pogodaev.dm@gmail.com>
Simplify plugin installation and runtime loading around package-manager-owned dependencies, with Jiti reserved for local/TS fallback paths.
Also scans npm plugin install roots so hoisted transitive dependencies are covered by dependency denylist and node_modules symlink checks.
Adds `agents.defaults.skipOptionalBootstrapFiles` for optional workspace bootstrap files, validates the supported filenames, and propagates the option through workspace bootstrap callers.
Also preserves legacy setup detection when `USER.md` or `IDENTITY.md` are intentionally skipped, documents the config field, and includes focused regression coverage.
Landing follow-up included small CI unblockers for current-base drift: removing an unused Brave runtime dependency, fixing Telegram RTT lint, and preserving compatible gateway-bindable plugin registry cache reuse when runtime ensures disable bundled dependency installation.