LUMIS scope guard
RU

Scope guard for your coding agent — free

Paste the things your product must NOT do. Get a hook that stops the agent's tool call and names the boundary, with configs for Claude Code, Cursor, Codex CLI, Devin Desktop (ex-Windsurf) and GitHub Copilot, a constitution and .cursorrules. No account, no model, ready in a second.

Typical orders

A starting list for a typical fixed-price order of this kind: one click adds these boundaries. Edit it to match the contract.

Ready boundaries — click to add

These presets are matched as text: packages, paths and phrases. Boundaries like “no personal data in logs” or “no secrets in the repository” cannot be checked by text, so they are not offered here (a secret in a tool call only gets a warning).

Unticked, the agent's push, publish or deploy is held for you: a prompt in Claude Code, Cursor and GitHub Copilot (its cloud agent treats a prompt as a refusal), a warning in Codex CLI and Devin Desktop (ex-Windsurf). Ticked, the hook refuses the push, publish and deploy commands it recognises (exit code 2) instead of asking.

For runs nobody watches. Unticked, a new dependency, a push or a write outside the project waits for your answer in Claude Code, Cursor and the Copilot CLI (overnight the agent stops until morning), is refused in the Copilot cloud agent, and goes through with a warning in Codex CLI and Devin Desktop (ex-Windsurf). Ticked, the hook refuses it right away with the reason in every client, the agent can carry on with the rest, and report lists in the morning what was refused instead of asked. Switch back any time: python scripts/scope_guard.py unattended off.

One per line, up to 25 lines.

What is inside

What unzips into the repository root:

  • .lumis/scope_guard.json triggers: packages, paths, keywords that block — and the words that only warn
  • .claude/settings.json hook config · Claude Code
  • .cursor/hooks.json hook config · Cursor
  • .codex/hooks.json hook config · Codex CLI
  • .devin/hooks.json hook config · Devin Desktop (ex-Windsurf)
  • .windsurf/hooks.json hook config · Devin Desktop (legacy)
  • .github/hooks/lumis-scope-guard.json hook config · GitHub Copilot
  • .github/workflows/lumis-boundary-check.yml the same check on every pull request (GitHub Actions)
  • scripts/scope_guard.py the hook itself: stdlib, exit code 2 stops the call
  • .lumis/.gitignore keeps the guard's log local, out of commits
  • .lumis/guard.manifest.json the files of the pack and their checksums — doctor compares them
  • CONSTITUTION.md your Non-Goals and invariants, verbatim
  • .cursorrules the same boundaries in the format the agent reads by itself
  • CLAUDE.md the same boundaries in the format the agent reads by itself
  • AGENTS.md the same boundaries in the format the agent reads by itself
  • README_SCOPE_GUARD.md install and check steps
  • SCOPE_ANNEX.md a short scope annex for a fixed-price contract: what is out of scope, how it is checked, what a change request is
Diagram: one repository root, several branches to the files of the pack, one of them marked in amber

Unzip into the repository root, then run python scripts/scope_guard.py doctor to check the wiring. Every agent picks up its own hook config on the next session — Claude Code, Cursor, Codex CLI, Devin Desktop (ex-Windsurf) and GitHub Copilot all stop a tool call on exit code 2. Then ask the agent to add something from the list — it must refuse or ask.

Or install it as an agent skill

Same engine, no download: the skill adds /lumis-scope-guard init, check and status to your agent and writes the same files into your repository: hook configs for Claude Code, Cursor, Codex CLI, Devin Desktop (ex-Windsurf) and GitHub Copilot, and the same boundaries as text rules (CONSTITUTION.md, .cursorrules, CLAUDE.md) for any other agent.

npx skills add momonanq/lumis-skills --skill lumis-scope-guard --global

github.com/momonanq/lumis-skills

No specification yet? The consilium builds one around these boundaries: PRD, architecture, roadmap, decision log, design constitution and a master prompt. Run the consilium — 2 free runs →