Migrating from 0.x to 1.0
Step-by-step guide for upgrading existing ps-lando projects from 0.6.x to 1.0.0.
ps-lando 1.0.0 is a breaking release. The CLI is now zero-config (drop any theme zip → ps-lando create works) and the four --skip-* group flags from 0.5.x were removed. Existing 0.6.x projects keep working with these adjustments.
Most teams finish this migration in under 10 minutes. The CI script update is the most likely place to need a tweak.
TL;DR: the runtime UX is unchanged for the default case (ps-lando create -y in a folder with panda.zip still works the same way). What changed: removed --skip-* flags, optional pslando.config.json, new init and cache clear commands, expanded hook env vars, and explicit theme + module prompts when you don't pass -y.
What's actually new in v1
If you've been on 0.6.x and only run ps-lando create -y, nothing about the default Panda flow changed for you — same selections, same Panda + Easy Builder sandbox, same byte-equivalent extraction.
What did change:
- Theme-agnostic. Drop a Falcon, Leo Classic, Hummingbird, custom — any zip with
config/theme.{yml,xml}— andps-lando createdeploys it. The--pandaflag is gone (and never existed as a public flag in 0.6 — it was hard-coded). See Theme compatibility matrix for what we've validated. - Explicit prompts when you don't pass
-y. Aselectprompt for the theme (orNone), and amultiselectfor the modules (everything pre-checked). With-yeverything auto-selects to match the v0.6 default. - Preset bound by selected theme name. Pick a theme called
pandain the prompt → bundledpandapreset activates. Pick anything else → no preset binds (use--preset=<name>to force one). - Module multiselect, not group flags. Group filters (
--skip-*) were replaced by the multiselect prompt +--exclude=<glob>/--only=<glob>for CI. - Optional
pslando.config.json.ps-lando initgenerates one if you want repeatable, explicit behavior in CI / monorepos.
None of these break a 0.6.x -y script. All of them are visible only when you go interactive (drop -y).
Step 1 — Update the CLI
npx ps-lando@1.0.0 --version
# or, if you have a global install:
npm i -g ps-lando@latest
ps-lando --versionNo registry change, no breaking package rename. The tarball is the same npm package.
Step 2 — Replace --skip-* flags in scripts and CI
The four group flags were removed and now exit with code 64 (UsageError) plus a one-line migration hint to stderr.
| Removed | v1 replacement |
|---|---|
--skip-easybuilder | --exclude=steasybuilder* |
--skip-blog | --exclude=stblog* |
--skip-social | --exclude=<glob> patterns or panda-preset config |
--skip-marketing | --exclude=<glob> patterns or panda-preset config |
--skip <list> | --exclude=<glob> (per-name patterns also work) |
Equivalent commands:
# Before (0.5.x / 0.6.x)
ps-lando create -y --skip-blog --skip-easybuilder
# After (1.0+)
ps-lando create -y --exclude=stblog* --exclude=steasybuilder*Did your CI break? Find old flags in scripts
Run these greps from your project root (or your CI repo root) to find every occurrence of the removed flags:
# Find all --skip-* invocations
grep -rEn -- '--skip-(blog|easybuilder|social|marketing)\b' \
--include='*.sh' --include='*.yml' --include='*.yaml' \
--include='*.json' --include='*.md' --include='Makefile' .
# Find legacy --skip <list> (note: trailing space, takes a value)
grep -rEn -- '--skip [A-Za-z]' \
--include='*.sh' --include='*.yml' --include='*.yaml' .
# GitHub Actions specifically
grep -rEn -- '--skip-' .github/workflows/If any of those return hits, replace per the table above. The CLI's stderr hint is identical to the migration table — copy-paste safe.
Step 3 — (Optional) generate a pslando.config.json
ps-lando init is the new interactive scaffolder. It writes:
pslando.config.jsonwith your chosen theme + preset.init-scripts/01-example.sh(commented example, only ifinit-scripts/doesn't exist yet).- A
.gitignoreentry for.pslando-cache.json.
ps-lando init # interactive (clack), 7 prompts
ps-lando init --yes # write defaults, no prompts
ps-lando init --force # overwrite an existing configThe init wizard is optional — zero-config still works. Use it if you want repeatable, explicit behavior in CI / monorepo setups.
Step 4 — .ps-lando.json schema migration (auto-lifted)
The legacy .ps-lando.json (auto-written by ps-lando create since 0.6.0) is lazily migrated — ps-lando v1 reads both shapes, and the next write upgrades the file in place.
Field mapping
| 0.6 (legacy) | 1.0 (new) |
|---|---|
panda: true | theme: "panda", presets: ["panda"] |
panda: false | theme: "classic", presets: [] |
panda_version: "1.2.3" | themeVersion: "1.2.3" |
child_theme: "panda_child" | childTheme: "panda_child" |
module_selection.groups_skipped: ["easybuilder"] | excludePatterns: ["steasybuilder*"] |
module_selection.modules_skipped: [...] | merged into excludePatterns |
module_selection.only_modules: [...] | merged into modules.only |
module_selection.no_copy_skipped: true | now a CLI flag only (--no-copy-skipped) |
Read tolerance
- Missing
schema→ assumedschema: 0(treat as 0.6). panda: trueAND notheme→ derivetheme = "panda",themeVersion = panda_version,presets = ["panda"].panda: falseAND notheme→ derivetheme = "classic",presets = [].child_theme(snake) → mirrored tochildTheme(camel).
Write behavior
- Always write
schema: 1plus all v1 fields. - ALSO write the legacy
panda,panda_version,child_thememirrors so a 0.6 ps-lando install can still read the file. Removable in v2.0.
This means a 0.6.x → 1.0 migration is risk-free even on shared sandboxes — the file stays readable both ways until everyone upgrades.
Step 5 — New env vars in your hooks (optional)
init-scripts/*.sh and post-scripts/*.sh now receive 4 new env vars on top of the existing set:
| Variable | Phase | Use |
|---|---|---|
PS_LANDO_THEME_NAME | init + post | Gate hooks to a specific theme. |
PS_LANDO_PRESETS | init + post | Gate hooks to a specific preset (comma-separated list). |
PS_LANDO_MODULES_INSTALLED | post-only | Log how many modules made it through. |
PS_LANDO_RESOLVED_PLAN_JSON | init + post | Full resolved plan as JSON. Falls back to @/path/to/file.json over 32 KB. |
Existing hooks keep working — these are additive. See Hooks & recipes for examples.
Step 6 — New commands worth knowing
| Command | What it does |
|---|---|
ps-lando init | Interactive scaffolder (clack, 7 prompts). Generates pslando.config.json. |
ps-lando cache clear | Wipes the local plan cache (.pslando-cache.json). Use when zip detection feels stuck. |
The existing create, info, open, install-modules, db reset, db dump, db restore, doctor, hooks, activate-theme, list, destroy, repair commands keep their 0.6.x behavior.
What stays the same
ps-lando create -yin a folder withpanda*.zipstill installs the same Panda + Easy Builder sandbox.- All hook env vars from 0.4.0+ are still injected (additive change).
- Recipes (
spain-taxes,demo-catalog-10, etc.) work unchanged. - Lifecycle commands (
db reset,db dump,db restore,doctor) are unchanged. - The
.ps-lando.jsonfile is still written on everycreate(now in v1 shape with legacy mirrors).
Quick rollback
If something breaks and you need to un-stick a teammate fast:
npx ps-lando@0.6.0 <whatever>The 0.6.0 tarball stays on npm forever and reads the v1-shaped .ps-lando.json thanks to the legacy mirrors written in Step 4. No data migration needed in either direction within the 0.6 ↔ 1.0 window.