.agents/skills/typescript-magician/SKILL.md
Designs complex generic types, refactors `any` types to strict alternatives, creates type guards and utility types, and resolves TypeScript compiler errors. Use when the user asks about TypeScript (TS) types, generics, type inference, type guards, removing `any` types, strict typing, type errors, `infer`, `extends`, conditional types, mapped types, template literal types, branded/opaque types, or utility types like `Partial`, `Record`, `ReturnType`, and `Awaited`.
npx skillsauth add shandin17/paperclaw typescript-magicianInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill for:
any types from codebasesWhen invoked:
tsc --noEmit to capture the full error output before making changesany, etc.)any types with proper typing — validate each replacement still satisfies call sitestsc --noEmit passCapabilities include:
For every TypeScript challenge:
any with genericsBefore
function getProperty(obj: any, key: string): any {
return obj[key];
}
After
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
// getProperty({ name: "Alice" }, "name") → inferred as string ✓
Before
async function fetchUser(): Promise<any> {
const res = await fetch("/api/user");
return res.json();
}
After
interface User { id: number; name: string }
function isUser(value: unknown): value is User {
return (
typeof value === "object" &&
value !== null &&
"id" in value &&
"name" in value
);
}
async function fetchUser(): Promise<User> {
const res = await fetch("/api/user");
const data: unknown = await res.json();
if (!isUser(data)) throw new Error("Invalid user shape");
return data;
}
Read individual rule files for detailed explanations and code examples:
as const and typeof[number] indexinginfer to extract types within conditional typestools
# Searcher Agent You find and retrieve documents from the user's archive. You have access to `qdrant` (semantic search) and `paperless` (full-text search and document fetch) tools. ## Mode behaviour - **document**: Return a list of matching documents. Include `fileToSend` with the best match so the user gets the original file. - **data**: Extract structured data from the best matching document(s). Return key-value pairs. Do NOT include `fileToSend`. - **both**: List documents AND extract data
tools
# Indexer Agent You store and classify documents. You have access to `paperless` tools and can invoke the `embedder` agent. ## Workflow 1. Use `paperless_upload` with `filePath: <fileUrl from input>` to upload the file. This returns `{ documentId, content }`. 2. Read the `content` field (OCR text) from the upload result. 3. Classify the document type (e.g. `passport`, `contract`, `invoice`, `medical`, `receipt`, `id_card`, `bank_statement`, `other`). 4. Generate a short descriptive title (e.g
documentation
# Form-Filler Agent You analyze forms and fill them using data from the user's stored documents. ## Workflow 1. The form file is passed to you as a base64 image in the user message. Analyze it visually. 2. Identify all fields in the form (name, date of birth, passport number, address, INN, etc.). 3. For each field, invoke `searcher` to find the relevant data: `invoke("searcher", { query: "<field description>", mode: "data" })`. 4. Map retrieved data to form fields. Record the source document
documentation
# Embedder Agent Custom runner — does not use an LLM. Chunks the input text, generates embeddings via OpenAI text-embedding-3-small, and upserts all vectors into Qdrant with document metadata.