Rust-style discipline for TypeScript: bans null/undefined/optionals/booleans-as-state/any/unknown/positional-args/string-widening/phantom-type-params/degenerate-comparators. Forces discriminated unions and exhaustive switches everywhere domain state lives. Per-file PreToolUse Write/Edit hooks plus SessionStart rule injection plus a bundled ESLint plugin for cross-file rules the per-file hook cannot see.
Set up ESLint integration for perfect-typescripter's four cross-file rules. Use when the user says 'set up linting', 'wire up eslint', 'how do I run the cross-file rules', 'set up perfect-typescripter for this project', 'install perfect-typescripter integration', or when a TS project (tsconfig.json or .ts files) has no eslint.config.* / .eslintrc.* in the project root.
Set up or edit .claude/ai-lab/perfect-typescripter/config.json to tune TypeScript enforcement rules. Use when the typescript guard blocks writes and the user wants to disable a rule, add exemptions, or configure the enforcer, or when the user says 'configure typescripter', 'disable boolean rule', 'add exemption', 'typescripter config'.
TypeScript enforcement rules. Auto-loads when Claude writes .ts or .tsx files so the rule context is in sight before the first line goes down. Contains the bans on null, undefined, optionals, booleans, any, unknown, enums, type assertions, and positional args; PreToolUse hooks enforce them and will block writes that violate them.
Modifies files
Hook triggers on file write and edit operations
Uses power tools
Uses Bash, Write, or Edit tools
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
Rust-style discipline for TypeScript. Bans null, undefined, optional fields, booleans-as-domain-state, any, unknown, positional args (>1), string widening, phantom type parameters, degenerate comparators, missing @why tags on exports, and other shapes that compile but rot in production. Forces discriminated unions and exhaustive switch everywhere domain state lives.
Pick your runtime, run the one-liner, done.
claude plugin marketplace add https://github.com/CheckPickerUpper/perfect-typescripter
claude plugin install perfect-typescripter@perfect-typescripter --scope user
git clone https://github.com/CheckPickerUpper/perfect-typescripter \
~/.codex/plugins/cache/perfect-typescripter/perfect-typescripter/local
git clone https://github.com/CheckPickerUpper/perfect-typescripter ~/perfect-typescripter
Then add to your opencode.json:
{ "plugin": ["file:///home/you/perfect-typescripter/.opencode/perfect-typescripter-opencode-bundle.js"] }
npx skills add CheckPickerUpper/perfect-typescripter
git clone https://github.com/CheckPickerUpper/perfect-typescripter
npm install --save-dev file:./perfect-typescripter/eslint-plugin
Or run /setup-eslint inside Claude Code to scaffold ESLint config, parser, and pre-commit in one pass.
For full per-surface install detail (project config, custom flags, npm-publish status), jump to Install (full).
| Artifact | Catches | Where it lives |
|---|---|---|
| Claude Code / Codex / OpenCode plugin | The file you are writing. PreToolUse Write / Edit hooks block the bad shapes before they land on disk. | this repo's root |
eslint-plugin-perfect-typescripter | Patterns that span files: phantom type params, duplicate envelope shapes, shared variant literals across discriminated unions, variant prefix drift. | ./eslint-plugin/ |
Per-file hook plus cross-file ESLint closes the gap that either alone leaves open.
A taste; full catalogue in docs/RULES.md:
// blocked: optional field
type User = { name: string; email?: string };
// blocked: null / undefined in declared types
type Maybe = string | null;
function find(): User | undefined { ... }
// blocked: boolean as domain state
function setStatus(active: boolean) { ... }
// blocked: positional args (> 1)
function move(x: number, y: number, z: number) { ... }
// blocked: string widening of literal union
type Variant = "Small" | "Medium" | "Large" | string;
// blocked: phantom type parameter (TKind never used in the body)
type Registry<TKind, V> = { entries: V[] };
// blocked: degenerate comparator returning boolean over a typed input
function isSameTransition(prev: Slot, next: Slot): boolean { ... }
The correct shape in each case is a discriminated union with a Kind field and an exhaustive switch. See docs/RULES.md for the rewrite of each example.
The quickstart above gets you running. This section spells out per-surface options (project config, override flags, npm-publish status, etc) for users who need them.
| Surface | Status | Quickstart command |
|---|---|---|
| Claude Code (plugin marketplace) | ✅ ready | claude plugin marketplace add https://github.com/CheckPickerUpper/perfect-typescripter && claude plugin install perfect-typescripter@perfect-typescripter --scope user |
| Codex CLI | ✅ ready | git clone https://github.com/CheckPickerUpper/perfect-typescripter ~/.codex/plugins/cache/perfect-typescripter/perfect-typescripter/local (Codex auto-discovers .codex-plugin/plugin.json) |
| OpenCode | ✅ ready | Clone, then add "file:///.../.opencode/perfect-typescripter-opencode-bundle.js" to opencode.json plugin array (or drop into ~/.config/opencode/plugins/). See OpenCode below. |
Skills CLI (skills.sh / npx skills) | ✅ ready | npx skills add CheckPickerUpper/perfect-typescripter |
| npm (ESLint plugin only) | 🚧 not yet published | (planned: npm install --save-dev eslint-plugin-perfect-typescripter after first release) |
The repo doubles as a single-plugin marketplace via .claude-plugin/marketplace.json + .claude-plugin/plugin.json. Install in one step:
claude plugin marketplace add https://github.com/CheckPickerUpper/perfect-typescripter
claude plugin install perfect-typescripter@perfect-typescripter --scope user
npx claudepluginhub checkpickerupper/perfect-typescripter --plugin perfect-typescripterNo description provided.
Upstash Context7 MCP server for up-to-date documentation lookup. Pull version-specific documentation and code examples directly from source repositories into your LLM context.
Comprehensive startup business analysis with market sizing (TAM/SAM/SOM), financial modeling, team planning, and strategic research
v9.44.1 — Patch release for Gemini environment/version detection and qwen auth gating. Run /octo:setup.
Complete creative writing suite with 10 specialized agents covering the full writing process: research gathering, character development, story architecture, world-building, dialogue coaching, editing/review, outlining, content strategy, believability auditing, and prose style/voice analysis. Includes genre-specific guides, templates, and quality checklists.
Comprehensive .NET development skills for modern C#, ASP.NET, MAUI, Blazor, Aspire, EF Core, Native AOT, testing, security, performance optimization, CI/CD, and cloud-native applications
Comprehensive skill pack with 66 specialized skills for full-stack developers: 12 language experts (Python, TypeScript, Go, Rust, C++, Swift, Kotlin, C#, PHP, Java, SQL, JavaScript), 10 backend frameworks, 6 frontend/mobile, plus infrastructure, DevOps, security, and testing. Features progressive disclosure architecture for 50% faster loading.