.claude/skills/lisa-update-projects/SKILL.md
This skill should be used when updating local Lisa projects in batches. It reads the project list from .lisa.config.local.json, checks out the target branch, pulls the latest, creates an update branch, runs the package manager update for @codyswann/lisa, migrates legacy CI workflows, checks for upstream changes, then commits, pushes, and opens a PR for each project.
npx skillsauth add codyswanngt/lisa lisa-update-projectsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Updates local Lisa projects in batches by running the package manager update command for @codyswann/lisa in each configured project, which triggers Lisa's postinstall script to apply template changes automatically.
chore/lisa-update-YYYY-MM-DD).@codyswann/lisa is in the project's trustedDependencies array in package.json. If missing, add it using jq. Bun only runs postinstall scripts for trusted packages, so without this entry Lisa's postinstall (template application and file deletions) is silently skipped.package.json engines BEFORE choosing a command. The engines field is authoritative — lockfile presence is not.
engines with jq -r '.engines // {}' package.json.engines.bun === "please-use-npm" (or engines.yarn / engines.pnpm use the same sentinel), that package manager is forbidden. Use npm.bun.lock in a project where engines.bun === "please-use-npm"), it is rogue — bun ignores the engines string and writes the lockfile if invoked. Delete it (git rm bun.lock) and include the deletion in the commit.bun.lock exists and bun is allowed → bun update @codyswann/lisanpm install -D @codyswann/lisa@latest (use install -D not update; npm update only bumps within the existing semver range and won't move pinned versions or update the manifest)npm install -D, manually run node node_modules/@codyswann/lisa/dist/index.js --yes --skip-git-check . to apply templates.bun add and npm install against the same project. That perpetuates the dual-lockfile bug. Pick one based on the engines field and stick to it.@codyswann/lisa appears in the project's dependencies (not devDependencies). If so, move it: remove from dependencies and ensure it's in devDependencies. Use jq to check and the package manager to reinstall correctly..github/workflows/ matching claude*.yml, claude*.yaml, auto-update-pr-branches.yml, auto-update-pr-branches.yaml, ci.yml, ci.yaml, deploy.yml, and deploy.yaml:
steps: blocks instead of calling uses: CodySwannGT/lisa/.github/workflows/reusable-*.yml@main, it is legacy.bin/rails or config/application.rb; TypeScript: has tsconfig.json or package.json with TypeScript signals). A repo may be both.ci.yml/ci.yaml in a Rails project → rails/create-only/.github/workflows/ci.yml (calls quality-rails.yml@main)deploy.yml/deploy.yaml in a Rails project → rails/create-only/.github/workflows/deploy.yml (calls release-rails.yml@main)ci.yml/ci.yaml in a TypeScript-only project → typescript/create-only/.github/workflows/ci.yml (calls quality.yml@main)claude*.yml/claude*.yaml → typescript/create-only/.github/workflows/ (e.g., claude.yml → reusable-claude.yml@main, claude-ci-auto-fix.yml → reusable-claude-ci-auto-fix.yml@main)auto-update-pr-branches.yml/auto-update-pr-branches.yaml → typescript/create-only/.github/workflows/ (calls reusable-auto-update-pr-branches.yml@main)file: references to bundled ESLint plugins from the project's package.json. Previous Lisa versions copied plugin directories and added file:./ dependencies; current Lisa deletes the directories but the package.json references remain. Use jq to remove these keys from both dependencies and devDependencies if they exist:
eslint-plugin-code-organizationeslint-plugin-component-structureeslint-plugin-ui-standards$CLAUDE_PROJECT_DIR/.claude/hooks/ references from the project's .claude/settings.json. Previous Lisa versions installed hook scripts into the project's .claude/hooks/ directory and registered them in .claude/settings.json. Current Lisa deletes these scripts via all/deletions.json and provides them through the plugin system (${CLAUDE_PLUGIN_ROOT}/hooks/ in plugin.json) instead. The settings.json references to the deleted scripts cause "No such file or directory" errors. Use jq to:command contains $CLAUDE_PROJECT_DIR/.claude/hooks/echo ..., command -v entire ..., etc.).github/workflows/ (e.g., claude-nightly-jira-triage.yml), compare the cron schedule against the corresponding template in typescript/create-only/.github/workflows/ (or rails/create-only/ for Rails projects) in the Lisa repo. If the project's schedule differs from the template, update it to match. For example, if the template uses 0 */2 * * * but the project still has 0 6 * * 1-5, update the project file.git diff to see if the project changed any Lisa-managed files. If so, examine them to see if any changes need to be upstreamed back to Lisa and do so if necessary.For steps 4-13, use up to 4 parallel subagents to accomplish those steps.
If the Lisa postinstall crashes, rolls back changes, or applies incorrect templates during a project update, do not just work around it in the downstream project. Instead:
Common symptoms that indicate an upstream Lisa bug:
[WARN] Rolling back changes...) followed by an errorThe goal is to fix bugs at the source so they don't recur on every future update across all projects.
development
Prepare a machine — a fresh laptop or a throwaway container — to run coding agents, before any repository exists. Detects which of Lisa's supported agents (Claude Code, Codex, Cursor, OpenCode, Antigravity, Copilot) are already installed, asks which credential manager the machine uses (Bitwarden, 1Password, Doppler, Vault, AWS, or none), and installs only what is missing, each by its vendor's own preferred method. Idempotent, headless by default, and emits a Dockerfile for a spin-up/spin-down environment. Run it on a new machine, in a container, or before cloning anything.
tools
Provision and verify a remote execution environment for a host project — Codex Cloud today, other remote surfaces as they are added. Generates a repository-owned setup script that installs the declared toolchain, materializes secrets through lisa-secrets-access, and runs the project's own hook. Provisions by API where one exists, by driving the vendor console where one does not, and by emitting exact config otherwise — then proves the result with the same read-back regardless of which tier did the work. Use before dispatching any work with executionEnv.
tools
Bring a developer's machine in line with the toolchain the project declares. Reports every tool in remoteEnv.tools that is missing, outdated, or unpinned for this platform, and installs the missing ones into ~/.local/bin from the same pinned, checksummed entries the remote surfaces use — but only when asked. Same manifest, same pins, same installers as lisa-setup-remote-env; what differs is consent and that the pin is a floor rather than an equality. Run it on a fresh checkout, after a manifest change, or when a tool fails at the moment of use.
tools
Route one unit of work to a remote execution surface. Reads the executionEnv parameter (local by default, codex-cloud or claude-web today), verifies the environment is provisioned and bound to this repository, submits a thin skill invocation, records the task identifier to .lisa/remote-dispatch.json, and exits without polling. Routing only — the remote runs the identical skill from the identical repository. Composable and inline: other skills invoke it via the Skill tool rather than users calling it directly.