For Overwatch Workshop and OverPy
Workshop code, checked.
Stop guessing where the server-load risks are. Wright statically analyzes Workshop and OverPy code and points every problem to a line.
curl -fsSL https://install.wrightkit.dev/wright/install.sh | bash $ wright lint rules.txt╭─ WARN lint│ 1 warning(s), 1 info finding(s)│├─ warning[min-wait-loop]: loop body waits at the workshop minimum rate; the loop runs at maximum frequency│ --> rules.txt:27:3│├─ info[expensive-loop-check]: geometry predicate evaluated inside a loop body may be expensive per iteration│ --> rules.txt:29:7│╰─ 1 file(s) affectedCopy. Save. Check.
- 1
Copy from the game
Copy your rules or full game settings, the same way you would to share them.
- 2
Paste into a file
Save it as a text file, such as rules.txt. English and Chinese client code both work.
- 3
Run Wright
Each finding points to a line in the file. Fix it, then paste it back into the game.
wright lint rules.txt
What it catches.
Typos
A misspelled action or value, caught before you paste the code back.
Heall(Event Player, Null, 10);error[unknown-action]: unknown action spelling 'Heall' for locale 'en-us' (did you mean 'Heal'?)
While without Wait
A loop that never pauses can overload the server.
While(Is Alive(Event Player)); Heal(Event Player, Null, 10); End;warning[while-without-wait]: loop body contains no wait call
Waiting 0.016 seconds
The loop runs as fast as the game allows.
While(Is Alive(Event Player)); Wait(0.016, Ignore Condition); Heal(Event Player, Null, 10); End;warning[min-wait-loop]: loop body waits at the workshop minimum rate
Line of sight in a loop
A geometry check repeated on every pass can get expensive.
While(Is Alive(Event Player)); Wait(0.25, Ignore Condition); If(Is In Line of Sight(Event Player, Vector(0, 0, 0), Barriers Do Not Block LOS)); Heal(Event Player, Null, 10); End; End;info[expensive-loop-check]: geometry predicate evaluated inside a loop body
More tools.
Analyze
Element cost, your most complex rules, server-load risks, and the variables most rules share. Each result says whether it is exact, static, or a heuristic.
wright analyzeInspect
Query rules, symbols, references, control flow, and call graphs. inspect cost breaks down each rule’s element cost and compares it with your last run.
wright inspectChecked edits
Rename a variable or subroutine, or apply lint fixes with lint --fix. Wright shows the validated diff first and writes only with --write.
wright renameLookup
Turn a near spelling into the exact name and signature of an action or value, in Workshop or OverPy.
wright lookupEditor
Errors as you type in editors that support language servers. Workshop files get hover, go to definition, and find references; OverPy files get navigation and rename. No VS Code extension yet.
wright-lspCI
Run Wright in GitHub Actions and findings show up on the pull request.
wright lint
Workshop, OverPy, and OSTW.
Workshop
SupportedFull native syntax. Code from the English or Chinese client works as is.
workshop-rsOverPy
PartialKeep your .opy files. Wright checks, lints, analyzes, and renames them, and compiles them to Workshop with output held to the original OverPy compiler.
opy-rsOSTW
Pauseddeltin-rs parses and type-checks OSTW, but feature work is paused. Wright does not support it yet.
deltin-rs
Built for coding agents, too.
JSON output
Add --format json to any command. One versioned schema.
Stable codes
Diagnostic codes, rule IDs, and exit codes an agent can rely on.
Agent guide and MCP
wright agent install adds the Wright guide to your project. Add --mcp claude, cursor, or vscode to register the MCP server too.
- From request to change
Get Wright.
wright and wright-lsp, in one install.
Homebrew
Apple silicon & Intelbrew install wrightkit/tap/wright Installs the released wright and wright-lsp binaries.
Installer script
curl -fsSL https://install.wrightkit.dev/wright/install.sh | bash Release archives and checksums for every platform are on the GitHub Releases page.