@codixus/mt
Cross-platform skill manager + dev shortcut CLI for Claude Code, Codex, Gemini CLI, Cursor and other AI coding agents.
Install
npm i -g @codixus/mt
bun add -g @codixus/mt
Requires Bun ≥1.0 (the CLI ships as .ts and runs through bun).
Skill manager
Subscribe to skill repos (public or private), install only what you need, sync across machines.
mt login
mt add anthropics/skills --path "skills/frontend-design"
mt add me/private-skills --path "skills/*" --exclude "cxs-*"
mt sync
mt list
mt remove <name>
mt skills disable <name>
mt skills enable <name>
Two scopes, auto-detected by cwd:
- Global (
~/.mt/): installs to ~/.claude/, ~/.codex/, ~/.gemini/, etc.
- Local (
<project>/.mt/): installs only to that project's .claude/ etc.
Use --global or --local to override detection.
Per-name overrides live in skills.json's skills map, keyed by skill/command/agent leaf name:
{
"entries": [{ "name": "codixus", "repo": "codixus/skills", "path": "skills/*" }],
"skills": {
"cxs-app-audit": { "enabled": false },
"mtc": { "alias": "mt-commit" }
}
}
enabled: false excludes that name from every future mt sync (whether it comes from a glob subscription or not) and deletes any previously-synced copy immediately; alias materialises a new short name as a copy of an existing leaf. mt skills disable/mt skills enable manage the enabled flag for you; alias entries are still hand-edited directly in skills.json.
Shell shortcuts
Cross-platform alias manager (bash, zsh, fish, PowerShell 7+).
mt shortcuts add b "bun install"
mt shortcuts add bt "bun test"
mt shortcuts add mkcd "mkdir -p {1} && cd {1}"
mt shortcuts sync
exec zsh
b foo
mkcd test/dir
Templated args use {N} / {@} placeholders; mt translates per shell.
Built-in utilities
mt kp 3000 5173
mt sv ./public -p 8080
mt open .
mt awake
mt rimraf node_modules dist
mt compress *.png
mt convert webp *.png
Supported image formats: PNG, JPG/JPEG, WebP, AVIF.
Linter
mt lint is a generic project linter — works in any project, not skill-specific. ~35 rules covering things ESLint doesn't: secrets (AWS/JWT/Stripe/GitHub PATs), AI-slop phrases, Turkish diacritics, typography (smart quotes, em-dash, mojibake), design tokens (off-scale px/rem, raw hex, magic z-index), markdown structure, cross-platform footguns, and i18n locale sync.
mt lint
mt lint --all
mt lint --fix
mt lint init
mt lint list-rules
mt lint explain <ruleId>
mt lint install-hook
Agent hooks (Claude Code + Codex)
Built-in hooks ship with mt and are merged into both ~/.claude/settings.json (Claude Code) and ~/.codex/hooks.json (Codex) on mt sync. Pick which ones you want via ~/.mt/hooks.json (include / exclude over predefined ids).
mt setup --profile mt --global
mt hooks list
mt hooks enable <id>
mt hooks disable <id>
mt hooks sync
Shipped hooks:
block-claude-coauthor | Blocks a Claude/Anthropic co-author trailer, a Generated with/by/using Claude Code trailer, or an @anthropic.com email — in git Bash calls and in file content (Write/Edit/MultiEdit on Claude Code, apply_patch added lines on Codex), closing the bypass of writing the trailer into a file and git commit -F-ing it. |
block-em-en-dash | Blocks new content containing an em-dash or en-dash (AI-typography tell) — Write/Edit/MultiEdit on Claude Code, apply_patch added lines on Codex. The hook self-exempts edits to its own source under hooks/pretooluse/block-em-en-dash.{ts,partial.json,partial.codex.json}; for other files that legitimately contain those characters, run mt hooks disable block-em-en-dash first. |
protect-hooks | Blocks Write/Edit/MultiEdit (Claude Code) and apply_patch (Codex) edits whose target is a managed hook source (hooks/pretooluse/*.{ts,partial.json,partial.codex.json}, hooks/lib/*.ts, hooks/registry.json, and anything under ~/.agents/hooks/), so the agent can't weaken or disable the guards by editing their source. To change a hook, run mt hooks disable <id> first, edit, then mt hooks sync. Covers file-tool edits only — not Bash sed/redirection, nor the merged settings.json/hooks.json. |
inject-mt-start | SessionStart hook (fires on startup/clear/compact): injects the mt-start development-workflow skill into context, plus the workspace docs/MEMORY.md when present. Reads the installed skill at ~/.agents/skills/mt-start/SKILL.md (single source of truth, no duplication) and stays silent when it is absent. MEMORY.md path resolves from $MT_DOCS, then $WS/docs, then ~/Documents/Coding/docs. |
The merge is idempotent: managed handlers are matched by absolute script path under ~/.agents/hooks/, so user-added entries in either file are preserved untouched. Hooks are global only.
Codex note: Codex requires reviewing and trusting non-managed hooks before they run, keyed to the exact hook definition — after a sync adds or changes hooks, run /hooks inside Codex to trust them. Per-hook Codex variants live next to the Claude partials as *.partial.codex.json (the Claude partial is reused when no variant exists).
Skill authoring
If you maintain a skills repo, these helpers operate on the repo's skills/, commands/, and agents/ folders:
mt skills validate
mt skills new <name>
mt skills list
Self-update
mt upgrade
Configuration
mt uses a .mt/ config folder (npm-style global vs local).
skills.json | skill subscriptions + cherry-picks | global + local |
shortcuts.json | shell aliases | global only |
hooks.json | Claude Code hook include/exclude | global only |
lint.json | lint rules + ignore patterns | global + local |
manifest.json | mt's record of installed files (don't edit) | global + local |
auth.json | GitHub token (chmod 600) | global only |
Auth chain (in order): ~/.mt/auth.json → $MT_GITHUB_TOKEN → $GITHUB_TOKEN → gh auth token. mt never embeds tokens; it delegates to whatever auth you already have.
License
MIT.