plugins/lisa-copilot/skills/lisa-nightly-lower-code-complexity/SKILL.md
Nightly direct-execution skill for reducing code complexity thresholds. Receives pre-computed threshold data, refactors violations, updates thresholds, commits, and creates a PR.
npx skillsauth add codyswanngt/lisa lisa-nightly-lower-code-complexityInstall 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.
The caller provides pre-computed context:
npm, yarn, or bun)Update eslint.thresholds.json with the proposed new threshold values (do NOT change the maxLines threshold)
Run the project's lint script with the provided package manager (e.g., npm run lint, yarn lint, or bun run lint) to find functions that violate the new stricter thresholds
Before editing, check each violating file's total line count (wc -l). If a file is within 20 lines of its max-lines ESLint limit (typically 300), extract helpers into a separate companion file (e.g., fooHelpers.ts) instead of adding them to the same file. Extracting functions into the same file adds net lines and can create new max-lines violations.
Fix violations one file at a time. Read only the specific function that violates — do not pre-read all files upfront. Fix it, then move to the next.
For cognitive complexity violations: use early returns, extract helper functions, replace conditionals with lookup tables
For max-lines-per-function violations: split large functions, extract helper functions, separate concerns
After each file edit, run the project's formatter with the provided package manager (e.g., npm run format, yarn format, or bun run format) to ensure line counts reflect the final formatted state before moving on. Do not reach for a bare npx prettier: when the binary is absent npx silently installs and executes whatever the registry currently publishes under that name, which is an unpinned dependency introduced by a formatting step. If the project has no format script, run the lockfile-pinned binary directly (./node_modules/.bin/prettier --write <file>)
Re-run the lint script with the provided package manager to verify all violations are resolved (both the target metric AND max-lines)
Run the project's typecheck script with the provided package manager to catch type errors early — same reasoning as step 7, so npm run typecheck / yarn typecheck / bun run typecheck, falling back to ./node_modules/.bin/tsc --noEmit rather than npx tsc:
case "$PACKAGE_MANAGER" in
npm) runner=(npm run) ;;
yarn) runner=(yarn) ;;
bun) runner=(bun run) ;;
*) echo "unsupported package manager: $PACKAGE_MANAGER" >&2; exit 2 ;;
esac
status=0
"${runner[@]}" typecheck >tsc.log 2>&1 || status=$?
head -n 30 tsc.log; echo "exit=$status"
Capture the status before the pipe — a pipeline reports its LAST stage's exit code, and head always succeeds, so tsc --noEmit | head -30 reads as clean however many errors it printed (falsifiable-checks, pager-shadowed status). || status=$? rather than ; status=$?: under set -e the ; form exits before the assignment, so the failure is never reported at all. If there are type errors, fix them now — do NOT wait until the commit step. Pre-commit hooks run type checking, and discovering errors at commit time wastes turns.
Run the project's test script with the provided package manager (e.g., npm run test, yarn test, or bun run test) to verify no tests are broken by the refactoring
Commit all changes (refactored code + updated eslint.thresholds.json) with conventional commit messages
Create a PR with gh pr create with a title like "refactor: reduce code complexity: [metrics being reduced]" summarizing the changes
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.