plugins/lisa-copilot/skills/use-the-product/SKILL.md
Shared methodology for actually USING a project's product the way its real end user would — across product types (DOM web app, HTTP/API backend, canvas game, CLI/library, IaC/CDK). Detects the product's consumer-facing interface, drives it as that consumer, gated by a per-environment mutation policy read from .lisa.config.json (so the agent never mutates production data by accident), and lensed through the project's personas/subagents when it defines them. Invoked by exploratory-qa (files defect/UX tickets) and product-walkthrough (grounds planning in the live product); rarely run standalone.
npx skillsauth add codyswanngt/lisa use-the-productInstall 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.
Every product has a consumer-facing interface. To evaluate a product you (1) detect that interface, (2) resolve where you're allowed to drive it and how much you may change, and (3) drive it as the real consumer would — through the project's personas when it has them. This skill owns steps 1–4 below; the caller decides what to do with what you find (exploratory-qa files tickets, product-walkthrough grounds planning).
Driving the product means interacting with it. Static route scans, HTTP fetches, screenshots-alone, and reading the code are supporting evidence only — never a substitute for actually using it.
Infer from the repo; if genuinely ambiguous, ask one concise question.
| Signals | Type | Consumer-facing interface |
|---|---|---|
| vite/next/angular/svelte + index.html, DOM UI | DOM web app | the rendered UI in a real browser |
| API server (nest/express/fastify/serverless handlers), OpenAPI, no frontend | HTTP / API backend | the API endpoints |
| phaser/pixi/canvas game | Canvas game | the canvas + input (keyboard/pointer), read visually |
| cdk.json / Terraform / IaC | IaC / CDK | the resources it provisions (+ synth output) |
| bin/ CLI or published library, no server | CLI / library | the commands / public API |
Read the exploration block from .lisa.config.json (a repo-local config overrides a global one):
"exploration": {
"default": "<env-name>", // which env to use when none is passed
"environments": {
"<name>": {
"url": "https://dev.example.io", // web/API target (omit for local CLI/game)
"provision": true, // IaC/ephemeral: stand up, then tear down
"mutation": "forbidden | read-only | full",
"identity": "<test-account ref>", // which login to use (env var / 1Password ref)
"prodMutationAck": "<one sentence>" // REQUIRED to allow `full` on a production-named env
}
}
}
Resolve the target env: explicit argument → default → infer. Then the mutation level governs everything:
read-only — only non-mutating interactions: read endpoints (GET), view UI without submitting, cdk synth/diff, --help/dry-run. Never create / edit / delete.full — create / edit / delete allowed, but only as the identity test account and under Mutation Discipline (§5).forbidden — do not exercise this environment at all.Safety rules — enforced regardless of config:
exploration block, or an unconfigured env → treat as read-only. Never mutate without an explicit policy.prod / production) defaults to forbidden. It may be raised to full only when a written prodMutationAck justification is present (this is how a single-environment app — e.g. a local-only game whose only "env" is production and whose mutations are the user's own local save — deliberately opts in). A bare production: { "mutation": "full" } with no prodMutationAck is downgraded to forbidden, and you warn.identity test account.Look for the project's personas: wiki/personas/** (target-player archetypes, stakeholders) and persona subagents (e.g. the lisa-phaser target-player / player-advocate agents).
Apply the interface's read-only actions always; the mutate actions only when the policy is full.
GETs (curl/httpie). Mutate: exercise representative POST/PUT/DELETE flows with test data as the identity; check status codes, payload shapes, and error responses.bun run dev + Playwright), drive via keyboard/pointer into the canvas, and read state visually via screenshots (not the accessibility tree). Mutation is usually local save state. Judge readability, game-feel, and input responsiveness — not DOM breakpoints.--help, read-only commands, dry-runs. Mutate: run state-changing commands with disposable inputs.cdk synth → read the generated template; cdk diff vs. the deployed env; verify the resources, IAM, and outputs express what a consumer would expect. Flag over-broad IAM, missing/opaque outputs, resources that don't serve their stated purpose, and drift. Mutate (only when mutation: "full" and provision: true on an ephemeral/sandbox env): cdk deploy to the sandbox → recurse into the API/web playbook against the provisioned resources → cdk destroy. Never deploy to a real account without explicit sandbox-provisioning config.fullA real user creates, edits, and deletes things — exercise those flows when, and only when, the policy allows and always as the identity account.
qa- or codex-.Structured, raw observations for the caller — what you did, as whom (which persona / generic user), where (env + mutation level), what you saw, and what you could not reach and why (especially policy boundaries you stopped at). You do not file tickets or write plans; the caller does.
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.