Skip to content

refactor(shell): enhance shell detection and add VP_SHELL override - #1658

Merged
fengmk2 merged 16 commits into
voidzero-dev:mainfrom
nekomoyi:feat/vp-shell-env
May 24, 2026
Merged

refactor(shell): enhance shell detection and add VP_SHELL override#1658
fengmk2 merged 16 commits into
voidzero-dev:mainfrom
nekomoyi:feat/vp-shell-env

Conversation

@nekomoyi

@nekomoyinekomoyi commented May 21, 2026

Copy link
Copy Markdown
Collaborator

What changed

  • Replaced VP_SHELL_NU and VP_SHELL_PWSH with one env var: VP_SHELL
  • Added shell parsing that accepts bash, zsh, fish, nu, pwsh, and cmd

Why

The old approach depended on a few shell-specific flags and inherited env vars. It could mis-detect nested shells and is harder to maintain.

The new shell detection stages:

  1. VP_SHELL if it is set
  2. Fallback to posix or cmd

Replace VP_SHELL_NU and VP_SHELL_PWSH with a single VP_SHELL env var
that accepts shell names (bash, fish, nu, pwsh, cmd). Detection now
follows: VP_SHELL → process tree inference → platform default.
- Add Shell::from_str for case-insensitive name parsing
- Add process tree walking to infer shell from parent processes
- Add sysinfo dep for Windows process enumeration
- Update shell wrapper scripts to remove shell-specific env vars
These tests assert on `detect_shell()` default fallback, but process
tree inference varies across environments (CI uses `shell: bash` on
Windows, local machines may have Git Bash), making the result
non-deterministic.
@netlify

netlifyBot commented May 21, 2026

Copy link
Copy Markdown

Deploy Preview for viteplus-preview canceled.

NameLink
🔨 Latest commit4212485
🔍 Latest deploy loghttps://app.netlify.com/projects/viteplus-preview/deploys/6a12f94ddd37fe0008e16fde

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors shell detection for the global CLI by consolidating multiple shell-specific env flags into a single VP_SHELL override, and adding process-tree inference to better detect the active shell for output formatting (notably vp env use eval output).

Changes:

  • Replaced VP_SHELL_NU / VP_SHELL_PWSH with a single VP_SHELL env var (case-insensitive parsing + aliases).
  • Added process-tree based shell inference (ps on Unix, sysinfo on Windows) with a platform-default fallback.
  • Added global snap tests validating VP_SHELL-driven formatting across supported shells.

Reviewed changes

Copilot reviewed 10 out of 11 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
packages/cli/snap-tests-global/command-env-use-shells/steps.jsonAdds snap-test commands covering VP_SHELL parsing and formatting.
packages/cli/snap-tests-global/command-env-use-shells/snap.txtSnapshot output for the new VP_SHELL shell-formatting coverage.
packages/cli/snap-tests-global/command-env-use-shells/package.jsonFixture metadata for the new snap-test case.
crates/vite_shared/src/env_vars.rsReplaces shell marker constants with VP_SHELL.
crates/vite_shared/src/env_config.rsUpdates EnvConfig to read VP_SHELL (and removes old marker fields).
crates/vite_global_cli/src/commands/shell.rsImplements Shell::FromStr, VP_SHELL override, and process-tree inference.
crates/vite_global_cli/src/commands/env/use.rsUpdates tests to use vp_shell: Some(...) instead of old marker booleans.
crates/vite_global_cli/src/commands/env/setup.rsRemoves wrapper-set env markers (VP_SHELL_NU, VP_SHELL_PWSH) from generated shell setup scripts.
crates/vite_global_cli/Cargo.tomlAdds Windows-only sysinfo dependency for process-tree inference.
Cargo.tomlAdds sysinfo to workspace dependencies.
Cargo.lockLockfile updates due to dependency graph changes.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadcrates/vite_global_cli/src/commands/env/setup.rs Outdated
Comment threadcrates/vite_global_cli/src/commands/env/setup.rs
Comment threadcrates/vite_global_cli/src/commands/shell.rs Outdated
Comment threadpackages/cli/snap-tests-global/command-env-use-shells/steps.json Outdated
Comment threadcrates/vite_shared/src/env_config.rs Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:7a3ed1ceb9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadcrates/vite_global_cli/src/commands/shell.rs Outdated
@nekomoyi
nekomoyi marked this pull request as ready for review May 21, 2026 20:12
@fengmk2

Copy link
Copy Markdown
Member

@codex review

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:271fbd296e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threadcrates/vite_global_cli/src/commands/shell.rs
@fengmk2fengmk2 added test: e2e Auto run e2e tests test: create-e2e Run `vp create` e2e tests labels May 22, 2026
Comment threadcrates/vite_global_cli/src/commands/shell.rs Outdated
@fengmk2
fengmk2 requested a review from naokihabaMay 22, 2026 07:07
@fengmk2fengmk2 self-assigned this May 22, 2026
@fengmk2
fengmk2 merged commit 53ae721 into voidzero-dev:mainMay 24, 2026
89 of 91 checks passed
liangmiQwQ pushed a commit to liangmiQwQ/vite-plus that referenced this pull request May 26, 2026
…oidzero-dev#1658)
## What changed
- Replaced `VP_SHELL_NU` and `VP_SHELL_PWSH` with one env var:
`VP_SHELL`
- Added shell parsing that accepts `bash`, `zsh`, `fish`, `nu`, `pwsh`,
and `cmd`
## Why
The old approach depended on a few shell-specific flags and inherited
env vars. It could mis-detect nested shells and is harder to maintain.
The new shell detection stages:
1. `VP_SHELL` if it is set
2. Fallback to posix or cmd
---------
Co-authored-by: MK (fengmk2) <fengmk2@gmail.com>
@fengmk2fengmk2 mentioned this pull request May 28, 2026
fengmk2 added a commit that referenced this pull request May 29, 2026
Release vite-plus v0.1.23.
Enterprise-ready HTTP (proxy + custom CA), task command shorthands in
`vite.config.ts`, a smoother `vp create`/`vp migrate`, and the
oxc/vite/rolldown bundled stack moves forward.
### Highlights
- **Proxy and custom-CA aware HTTP**: a new process-wide
`vite_shared::shared_http_client()` honors `HTTPS_PROXY` / `HTTP_PROXY`
/ `NO_PROXY`, picks up macOS System Settings / Windows registry proxies,
loads custom CAs from `SSL_CERT_FILE` and `NODE_EXTRA_CA_CERTS`, and
exposes a `VP_INSECURE_TLS` diagnostic switch; makes `vp` work through
Socket Firewall Free and other TLS-intercepting proxies
([#1686](#1686)), by
@fengmk2
- **Task command shorthands**: `run.tasks` entries in `vite.config.ts`
now accept a bare string (`"build": "cmd"`) or array (`"build": ["cmd1",
"cmd2"]`) instead of always requiring `{ command: ... }`; arrays reuse
the existing `&&` planning path so cache, `dependsOn`, and task options
stay consistent
([vite-task#391](voidzero-dev/vite-task#391)),
by @jong-kyung
- **Managed `vp outdated -g`**: routes through Vite+'s managed global
package metadata instead of delegating to the underlying `npm outdated
-g` store, so all installed global packages are reported consistently
([#1659](#1659)), by
@liangmiQwQ
### Features
- `vp pm approve-builds`: new unified subcommand that mirrors `pnpm
approve-builds` one-to-one, adapts to `bun pm trust`, and
warns-and-noops on npm/yarn
([#1662](#1662)), by
@fengmk2
- `vp create`: opt-in GitHub Copilot setup; selecting `--agent copilot`
now generates a `.github/workflows/copilot-setup-steps.yml` so the
Copilot Coding Agent can set up Vite+ and run `vp` in the new project
out of the box
([#1683](#1683)), by
@jong-kyung
- `vp migrate`: prompt to remove `baseUrl` from `tsconfig.json` before
applying type-aware lint defaults (runs `@andrewbranch/ts5to6
--fixBaseUrl .` under the hood; auto-applied in non-interactive mode)
([#1692](#1692)), by
@TheAlexLichter
- Respect `packageManager` in package-manager shims (`npm`/`npx`,
`pnpm`/`pnpx`, `yarn`/`yarnpkg`, `bun`/`bunx`); add non-mutating
`packageManager` resolution metadata for `vp env current` and `vp env
which` ([#1654](#1654)),
by @fengmk2
- vite-task: `--filter` no-match now exits `0` by default; add
`--fail-if-no-match` to opt back in
([vite-task#393](voidzero-dev/vite-task#393)),
by @kazupon
### Fixes & Enhancements
- `vp create`: keep generated `.vscode/settings.json` trackable when the
VS Code editor option is selected (avoid templates' `.vscode/*`
`.gitignore` masking it)
([#1700](#1700)), by
@jong-kyung
- `vp create vite:monorepo`: normalize sub-package `vite-plus` to
`catalog:` even when only `vite-plus` (not `vite`/`vitest`/...) is
present, and drop the `vite`/`vitest` aliases generated by the upstream
library template
([#1697](#1697)), by
@fengmk2
- `vp add/install -g <path>`: resolve the real package name from
`package.json` instead of using the path string, so local-path installs
don't create broken directories
([#1685](#1685)), by
@liangmiQwQ
- `vp test --coverage` and other direct built-in commands now expose the
workspace's `package.json#packageManager` to child processes so tools
like Vitest coverage can spawn the configured PM
([#1696](#1696)), by
@jong-kyung
- `vp migrate`: clean up the whole ESLint ecosystem (plugins, configs,
parser/resolver, type-utils) rather than just `eslint`; skip the
migration entirely when `@nuxt/eslint` is detected
([#1682](#1682)), by
@fengmk2
- `vp create`: write `fmt.configPath` (not `configPath`) for Zed oxfmt
settings to match the official Zed OXC extension layout
([#1687](#1687)), by
@chungweileong94
- `vp migrate`: parse `tsconfig.json` as JSONC so files with comments
don't break `baseUrl` detection/removal
([#1688](#1688)), by
@TheAlexLichter
- `vp env setup`: Unix env shims now point at the active `vp` executable
instead of always assuming `VP_HOME/current/bin/vp`, so Homebrew-style
installs work
([#1631](#1631)), by
@leohara
- `vp outdated -g` / `vp why -g`: don't require a local `package.json`;
global commands run regardless of cwd
([#1622](#1622)), by
@liangmiQwQ
- `vp create`: default the "Initialize a git repository?" prompt to yes
([#1650](#1650)), by
@fengmk2
- `vp` hooks: include the managed Node bin in `PATH` so
`./node_modules/.bin/vp` can find `node` from a VS Code commit on macOS
([#1647](#1647)), by
@TheAlexLichter
- `vpx` on Windows now invokes the package's `.cmd` shim instead of the
Unix binary
([#1652](#1652)), by
@tobynguyen27
- vite-task: bump cache database schema to version 13 (forces a one-time
rebuild of the local task cache)
([vite-task#402](voidzero-dev/vite-task#402)),
by @branchseer
- Bump vite-task to `d02b257` and `5833b374`; also bumps the repo's Rust
nightly toolchain to `nightly-2026-05-24` and ships the regenerated
`run` config types and docs for the new task command shorthand
([#1689](#1689),
[#1695](#1695)), by
@branchseer
### Refactor
- Replace `VP_SHELL_NU`/`VP_SHELL_PWSH` with a single `VP_SHELL`
override; add explicit shell parsing for `bash`, `zsh`, `fish`, `nu`,
`pwsh`, and `cmd`, and harden auto-detection against nested shells
([#1658](#1658)), by
@nekomoyi
- vite-task: replace `allocator-api2` with `bumpalo` collections
([vite-task#400](voidzero-dev/vite-task#400)),
by @branchseer
- vite-task: drop the unused `and_item_index` field from
`ExecutionItemDisplay`
([vite-task#394](voidzero-dev/vite-task#394)),
by @branchseer
### Docs
- Add the root `AGENTS.md` as the primary AI-agent guide for the
vite-plus repository; convert `CLAUDE.md` into a compatibility pointer
([#1670](#1670)), by
@jong-kyung
- Align the agent validation table to match `AGENTS.md`
([#1673](#1673)), by
@jong-kyung
- Update the task output caching guide so the documented behavior
matches what vite-task actually does
([#1639](#1639)), by
@ericclemmons
- Correct the bundled-source location in `packages/core/BUNDLING.md`
([#1660](#1660)), by
@shulaoda
### Chore
- Clarify `--help` text for `vp env default`/`pin`/`use`/`exec` with
`Examples:` blocks
([#1664](#1664)), by
@Boshen
- Refresh trusted stack stats on the docs homepage
([#1680](#1680)), by
@voidzero-guard[bot]
- Drop the standalone `pnpm --filter @rolldown/pluginutils build` step
now that `@rolldown/pluginutils` is published from its own package
([#1655](#1655)), by
@shulaoda
- Preserve single-quote style when `sync-remote` rewrites
`pnpm-workspace.yaml`
([#1672](#1672)), by
@lyzno1
- Enable `vite_pm_cli` lib tests by removing a stale `test = false` flag
([#1661](#1661)), by
@shulaoda
- CI: switch macOS runners back to `namespace-profile-mac-default`
([#1701](#1701)), by
@fengmk2
- CI: fix release-day flakes in the upgrade test and snap test when the
dev `package.json` version equals npm latest
([#1645](#1645)), by
@fengmk2
- CI: replace `zizmor` and `cargo-deny` workflows with
`oxc-project/security-action`
([#1635](#1635)), by
@Boshen
- CI: warm-up monorepo cache test under npm
([#1649](#1649)), by
@fengmk2
- CI: attach per-target `vp` binary archives (`.tar.gz`/`.zip`) to
GitHub Releases alongside the existing `vp-setup-*.exe` installers
([#1665](#1665)), by
@Boshen
- CI: declare Playwright via `repo.json` in ecosystem tests and bump
consumers to `>=1.60` to dodge the Node 24.16.0 hang
([#1668](#1668)), by
@fengmk2
- Update GitHub Actions
([#1640](#1640),
[#1675](#1675),
[#1678](#1678),
[#1679](#1679),
[#1691](#1691)), by
@renovate[bot]
- Upgrade upstream dependencies: vite `8.0.11 → 8.0.14`, rolldown `1.0.0
→ 1.0.3`, vitest `4.1.6 → 4.1.7`, oxlint `1.63.0 → 1.67.0`, oxfmt
`0.48.0 → 0.52.0`, oxlint-tsgolint `0.22.1 → 0.23.0`, `@oxc-project/*`
and oxc Rust crates `0.129.0 → 0.133.0`
([#1646](#1646),
[#1653](#1653),
[#1693](#1693),
[#1699](#1699)), by
@voidzero-guard[bot]
### Bundled Versions
| Tool | Version | Source |
| --- | --- | --- |
| vite | `8.0.14` |
[`c917f1e`](vitejs/vite@c917f1e)
|
| rolldown | `1.0.3` |
[`a287faa`](rolldown/rolldown@a287faa)
|
| tsdown | `0.22.0` | [npm](https://npmx.dev/package/tsdown/v/0.22.0) |
| vitest | `4.1.7` | [npm](https://npmx.dev/package/vitest/v/4.1.7) |
| oxlint | `1.67.0` | [npm](https://npmx.dev/package/oxlint/v/1.67.0) |
| oxlint-tsgolint | `0.23.0` |
[npm](https://npmx.dev/package/oxlint-tsgolint/v/0.23.0) |
| oxfmt | `0.52.0` | [npm](https://npmx.dev/package/oxfmt/v/0.52.0) |
### New Contributors
Welcome to all new contributors! 🎉
@ericclemmons, @tobynguyen27, @shulaoda, @leohara, @chungweileong94
**Full Changelog**:
v0.1.22...v0.1.23
Merging this PR will trigger the release workflow.
---------
Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com>
Co-authored-by: MK <fengmk2@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

test: create-e2eRun `vp create` e2e teststest: e2eAuto run e2e tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nekomoyi@fengmk2@naokihaba