Mods a PC game that you own: engine recon, game internals, fal assets, sprites, in-game tests, showcase videos, and field notes. Based on universal-modder by…

dotclaude is a Claude Code plugin for software engineering on official extension points. It turns compaction off, sets a 300K context window, asks only before dangerous commands, replaces the coding part of the system prompt with a short output style, and keeps the state of long work in OpenSpec changes and handoff notes across /clear. It optimizes for the most quality per unit of usage quota, not for speed.
The wiki tells what each part does and why. Parts lists each part with its file and bound. Design gives the source of each design claim.
/plugin marketplace add xsyetopz/dotclaude
/plugin install dotclaude@dotclaude
Requirements: Claude Code 2.1.292, Node.js 22.18 or later on PATH, and git. The hooks module uses the mods API of Claude Code, which can change between releases, so this release is tested only on 2.1.292.
Run /dotclaude:setup and restart Claude Code. A plugin settings file can set only agent and subagentStatusLine, so the skill merges the profile into a settings file that you choose. It shows each change and makes a backup first. It also checks OpenSpec and offers to install it and to run openspec init --tools claude.
| Part | What it does |
|---|---|
| No compaction | autoCompactEnabled: false and DISABLE_COMPACT=1, which also turns off /compact. |
| Window | CLAUDE_CODE_MAX_CONTEXT_TOKENS=300000 and CLAUDE_CODE_AUTO_COMPACT_WINDOW=300000. At the limit the session stops, and you run /clear. |
| No auto memory | autoMemoryEnabled: false. Handoff notes and OpenSpec hold the state. |
| System prompt | CLAUDE_CODE_SIMPLE_SYSTEM_PROMPT=1 and the forced dotclaude output style, which replaces the built-in coding instructions. |
| Permissions | Deny secret reads and disk wipes. Ask before force pushes, history rewrites, piped shells, sudo, publishes, public gh writes, and SQL drops. Allow read-only git and the usual build and test commands. |
| Sandbox | Bash runs in the sandbox, with network access only to GitHub and the package registries. |
| Guard | One hooks module asks before a recursive rm outside the project, and before the first call to a GitHub repository of another owner with an AI policy. |
| Status line | Model, effort, context against the window (yellow at 75%, red at 90%), the 5-hour limit, and the active OpenSpec change with its task count. |
| Agents | investigator, web-researcher, implementer, debugger, reviewer, test-runner. |
| Skills | /dotclaude:setup, /dotclaude:handoff. |
The plugin has no options. To drop a part of the profile, see the setup skill.
| Model | Roles | Effort |
|---|---|---|
| Opus 5.5 | main session, reviewer | default medium, reviewer high |
| Sonnet 5.5 | investigator, web-researcher, implementer, debugger | medium |
| Haiku 4.5 | test-runner | none |
The profile sets no effort level, so each model keeps its default. maxEffortLevel is xhigh, so /effort can go up for a hard check.
Each turn reads the whole context again, so the size of the context sets the cost of a turn.
/opsx:propose. After /clear, /opsx:apply continues at the first unchecked task./clear, run /dotclaude:handoff to write the goal, the decisions, and the proof to .claude/handoffs/<slug>.md. Start the next session with @.claude/handoffs/<slug>.md./clear, because a new model starts a new prompt cache. An effort change keeps the cache.Each add-on works without the core plugin.
/plugin install dotclaude-browser@dotclaude
/plugin install dotclaude-jev@dotclaude
/plugin install dotclaude-modder@dotclaude
dotclaude-browser has the drive-web-browser skill. It uses agent-browser, and its backend option selects CloakBrowser for sites with bot detection.dotclaude-jev has the second-opinion skill, which asks TypeSafe Jev for probabilities on a close call. Export TYPESAFE_API_KEY before Claude Code starts. Each call sends the data of the decision to the TypeSafe API.dotclaude-modder lets Claude mod a PC game that you own. It is a port of universal-modder by Rehan, and it needs Bun and uv. It adds one skill and the fal MCP server, so install it only where you mod games. For reverse engineering, use the skills in xsyetopz/skills. See Modder.claude plugin marketplace update dotclaude
claude plugin update dotclaude@dotclaude
CHANGELOG.md. Before 1.0, a release can change or remove behavior without a compatibility layer./dotclaude:setup again. It shows each change.0.27.0 is a rebuild that removes most 0.26 parts. See its changelog entry for the list. To try an unreleased checkout, run claude --plugin-dir /path/to/dotclaude/plugins/dotclaude.
just check runs lint, tests, plugin validation, and the hook lab. just sandbox runs Claude Code with this checkout in a separate config. See Development and Sandbox.
MIT.
hooks/module/index.mjs 32 lines1// The hooks module of dotclaude-modder.
2// It enforces a rule of the `mod-any-game` skill:
3// it denies a Bash call that stops processes by name or by pattern,
4// because the name can also match the shell of Claude or other apps of the user.
5// `um win kill <pid>` stops one process by its PID.
6
7// The first pattern matches `pkill` and `killall` only in command position,
8// so that `grep pkill notes.md` passes.
9const KILL_BY_NAME = [
10 /(?:^|[;&|(`"'\n]|\$\()\s*(?:(?:sudo|env|nohup|exec|command|time)\s+(?:-\S+\s+)*)*(?:pkill|killall)\b/,
11 /\btaskkill\b[^;&|\n]*\/(?:im|fi)\b/i,
12 /\b(?:Stop-Process|spps)\b[^;&|\n]*\s-(?:n|na|nam|name|processname)\b/i,
13 /\|\s*(?:Stop-Process|spps)\b/i,
14 /\bkill\b[^;&|\n]*(?:\$\(|`)\s*(?:pgrep|pidof)\b/,
15 /\|\s*xargs\b[^;&|\n]*\bkill\b/,
16];
17
18export const KILL_REASON =
19 "This command stops processes by name or by pattern. A name can also match your own shell or other apps of the user. Find the PID with `um win ps`, and stop that one process with `um win kill <pid>`.";
20
21/** True when `command` stops processes by name or by pattern. */
22export const killsByName = (command) =>
23 KILL_BY_NAME.some((re) => re.test(command));
24
25export function register(on) {
26 on("tool.call", async (_$, e, next) =>
27 e.tool === "Bash" && killsByName(String(e.command ?? ""))
28 ? { deny: KILL_REASON }
29 : next(e),
30 );
31}
32