oh-my-claudeagent / scripts
AGENTS.md3 starsChanged 32 days agoMITView on GitHub
Repository tooling, the libraries it shares, the docs capture pipeline and a manual QA harness. No hook handler lives here: hooks are the mod under hooks/ and the server handlers under servers/hooks/. Every file is TypeScript on bun. - validate.ts and validate/: the plugin validator. bun scripts/validate.ts [--check <group>]... runs the groups claims, formats, hooks, mod, tree, engine and mcp (all of them by default), prints one line per check and a final Summary: line, and exits 1 on any…
- Commits and pushes
In this repository22 other files it gives its agents.
- AGENTS.mdAGENTS.md
- hooks/AGENTS.mdAGENTS.md
- opencode/AGENTS.mdAGENTS.md
- servers/AGENTS.mdAGENTS.md
- skills/AGENTS.mdAGENTS.md
- statusline/AGENTS.mdAGENTS.md
- templates/AGENTS.mdAGENTS.md
- tests/AGENTS.mdAGENTS.md
- analyzerSkill
- build-fixerSkill
- consolidate-memorySkill
- debuggingSkill
- github-triageSkill
- git-masterSkill
- handoffSkill
- init-deepSkill
- omca-setupSkill
- planSkill
- refactorSkill
- remove-ai-slopsSkill
- reviewerSkill
- start-workSkill
The file
Files
Scripts
Repository tooling, the libraries it shares, the docs capture pipeline and a manual QA
harness. No hook handler lives here: hooks are the mod under hooks/ and the server handlers
under servers/hooks/. Every file is TypeScript on bun.
Layout
validate.tsandvalidate/: the plugin validator.bun scripts/validate.ts [--check <group>]...runs the groupsclaims,formats,hooks,mod,tree,engineandmcp(all of them by default), prints one line per check and a finalSummary:line, and exits 1 on any failure. Each check family is one module undervalidate/with its*.spec.tsbeside it.validate/core.tsholds the shared pieces: the check types,Runfor a finished child process,envWithoutfor a child environment, and the tracked-file listing. The depersonalization check scans every shipped file, andvalidate/allowlist.txtholds its exceptions; an entry that matches nothing fails.enginepackages a copy of the tree and runsclaude plugin validate --stricton it, and skips without the claude CLI.mcpruns the omca server through the handshake fixtures, andqa/install-verify.tsreuses it on a packaged copy. Thetreegroup fails a tracked python, bash or sh script, by its shebang or by a.py,.shor.bashname. Theformatsgroup reads every committed state fixture (registries, ledgers, plans, notepads) through the shared parsers;EXPECTED_INVALIDinvalidate/formats.tslists the fixtures that must keep failing.workflow.spec.tsparses.github/workflows/and checks both directions: CI runs every command of everyjust cirecipe, and every command CI runs belongs to one of those recipes or carries a reason to run in CI only.package.ts:bun scripts/package.ts <dest>copies the shipped tree, and--dry-runprints its file list. Only files git tracks ship.EXCLUDESkeeps out the repository tooling: every*.spec.ts,tests/,scripts/exceptscripts/setup-statusline.ts(KEEP), the rootpackage.json,bun.lock,bunfig.toml, the tsconfig files,.oxlintrc.json,justfile,.pre-commit-config.yaml,.editorconfig,CONTRIBUTING.md,opencode/,.opencode/andvideo/anddesign-lab/. Claude Code installs npm packages whenever the plugin root holdspackage.jsonand a lockfile. A leading/inEXCLUDESanchors a pattern at the root. Packaging deletes whatever in<dest>is not on the shipped list, so it refuses a<dest>that is the repository or a directory holding it, and a non-empty<dest>that is not an earlier package (one whose.claude-plugin/plugin.jsonnamesoh-my-claudeagent). A spec checks that every relative import and every path a shipped file names resolves inside the shipped tree.release.ts:bun scripts/release.ts <version>, behindjust release <version>. It refuses a version that is not semver, a tracked change in the working tree, a checkout that is notmainor not even withorigin/main, a localpluginbranch that does not containorigin/plugin, a version with no## [<version>]heading inCHANGELOG.md, and an existingv<version>orplugin-v<version>tag. It writes the version into.claude-plugin/plugin.json, both version fields of.claude-plugin/marketplace.jsonandpackage.json, commits the bump and tags itv<version>. It checks that tag out into a temporary worktree, runspackageTree, and commits the result to the orphanpluginbranch taggedplugin-v<version>, on top of the local branch or, in a fresh clone, oforigin/plugin. A child commit of the bump rewrites the marketplace plugin source to aurlsource onref: pluginwith that commit'ssha. It never pushes and prints onegit push --atomicof both branches and both tags. A failure part way restores the manifests, resets to the starting HEAD withgit reset --keep, deletes both tags and putspluginback on its previous tip, then says so.bench.ts:just bench. Runs the working tree or--candidate-refagainst--baseline-refthrough the mock model. It builds each ref in a git worktree. A baseline ref that has nostatusline/main.tsis installed withuv sync, souvmust be on PATH for it.benchmarks/compare/(outside this directory, packaging-excluded): the harness behindjust compare, which measures OMCA against similar plugins in Docker with a mock model. Its README has the stages and the files.setup-statusline.ts: the status line setup behind/oh-my-claudeagent:omca-setup, and the one file underscripts/that ships. It copiesstatusline/launcher.tsto the config directory, prints a diff of the settings file and, after confirmation, setsstatusLineandsubagentStatusLine.--uninstallremoves them.postedit-check.ts: runsjust typecheckafter an edit to a.tsfile and reports the first lines of a failure as hook context. A contributor wires it as aPostToolUseentry in their own.claude/settings.json;CONTRIBUTING.mdhas the entry.build-opencode.ts: compiles the terminal companion with OpenTUI's Solid plugin, leaving host packages external.just build-opencodewritesopencode/tui.generated.js;--checkrefuses an artifact that differs from its sources. Git/package installs load this artifact because source transformation excludesnode_modules.docs/: the capture pipeline.screenshots.tsruns real Claude Code sessions in tmux against the mock model and attaches kitty to each one on a private Xvfb display. With no name it writes the README shots to.github/assets/: a PNG still per scene (ImageMagickimport, optimized withmagick) and a GIF forpane-tourandguard-dialog(ffmpegx11grab, then palettegen and paletteuse).clipswrites the video footage tovideo/public/footage/: per clip a BT.709 MP4 at 30 fps, a<clip>.jsonmanifest of the frames at which its states first appeared (clip-manifest.ts, whichvideo/src/footage.tsmirrors) and a<clip>.sheet.pngcontact sheet of those frames. Each session gets a scratch HOME and config directory with the built-indarktheme, exceptclip-board-light, which useslight, andfixtures/acme-appis the project it opens. Pixels cannot be masked afterwards, soprivacy.tschecks the pane's plain text before and after each still and throughout each recording, and refuses the capture when it shows the username, the home path, the hostname or the scratch directory's name. It needs Xvfb, kitty, tmux, xdotool, ImageMagick, ffmpeg and ffprobe, and a JetBrains Mono font that fontconfig (fc-list) finds. An interrupted run tears its sessions and scratch directory down.just screenshotsruns it.qa/: the QA harness and the checks CI shares with it.just qais the manual pre-release run.ci-smoke.tsis the CI smoke job andjust smoke: oneclaude -psession with the packaged plugin loaded, in which the guard must deny a recursive removal (through PowerShell as well on Windows).junit-complete.tsreads the JUnit report of the CI bun spec run and fails unless the run has no failures and the report lists every spec file under the roots, so a crashed run that exits 0 still fails.session-smoke.ts,hook-live-probe.tsandworktree-bash.tsrunclaude -p, andmcp-live.tsruns an interactive session in tmux, each with the packaged plugin against the mock model (mock-model.ts), in a scratch project with its ownCLAUDE_CONFIG_DIR.mcp-live.tsruns once per MCP handshake mode, against the real omca server with a fake ast-grep that sleeps. It checks the handshake in the client's debug log, the progress line on a running tool call, that Escape cancels the call and ends the fake process, and the title and badge of each tool in/mcp.install-verify.tsandstatusline-probe.tscheck the packaged tree itself.worktree-bash.tsandagent-effort.tsare steps ofjust qa.visual.tsbacksjust visual <view>, masks the scratch directory's random suffix in each capture, and exports the tmux helpersmcp-live.tsanddocs/screenshots.tsshare.lib.tsholds the shared helpers:REPO, checks, scratch directories, theclaude -plauncher, the debug-log matchers and turn builders, signal-time cleanup and the real-config drift watch.eval-tasks.tsliststests/evals/tasks/*.json.- The two
bunfig.tomlpreloads live intests/fixtures/:canonical-tmp.tsgives every spec the long form ofTEMPon Windows, andplain-output.tsdropsFORCE_COLOR.spec-preload.spec.tschecks the first.
Conventions
- Scripts use erasable syntax and
.tsimport extensions. - A spec sits beside the script as
*.spec.tsand runs underjust test. - A spec or script that spawns a process passes
envexplicitly. - A script that runs on a contributor's machine uses
node:fsandBun.spawnargv, so it runs on Linux, macOS and Windows. The justfile recipes run in bash (Git Bash on Windows).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

