Spiceflow
remorses/spiceflow
Spiceflow is a super simple, fast, and type-safe API and React Server Components framework for TypeScript.
A skill your agent uses when writing or fixing TypeScript type code (.ts/.tsx/.d.ts), modeling data with generics/unions/branded types, diagnosing narrowing failures, or configuring tsconfig and the…
$ npx skills add ericrisco/rsc-harness --skill typescript -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness typescript --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/typescript .claude/skills/typescript && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "typescript" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/typescript into .claude/skills/typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ericrisco/rsc-harness/tree/main/skills/typescriptType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ericrisco/rsc-harness --skill typescript -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness typescript --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/typescript .agents/skills/typescript && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "typescript" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/typescript into .agents/skills/typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill typescript -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness typescript --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/typescript .cursor/skills/typescript && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "typescript" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/typescript into .cursor/skills/typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ericrisco/rsc-harness.git --path skills/typescript--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ericrisco/rsc-harness --skill typescript -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness typescript --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/typescript .gemini/skills/typescript && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "typescript" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/typescript into .gemini/skills/typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ericrisco/rsc-harness typescriptInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ericrisco/rsc-harness --skill typescript -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/typescript .github/skills/typescript && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "typescript" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/typescript into .github/skills/typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill typescript -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness typescript --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/typescript .opencode/skills/typescript && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "typescript" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/typescript into .opencode/skills/typescript/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "typescript", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
typescriptA skill your agent uses when writing or fixing TypeScript type code (.ts/.tsx/.d.ts), modeling data with generics/unions/branded types, diagnosing narrowing failures, or configuring tsconfig and the…
Typescript is an agent skill from ericrisco/rsc-harness. Use when writing or fixing TypeScript type code (.ts/.tsx/.d.ts), modeling data with generics/unions/branded types, diagnosing narrowing failures, or configuring tsconfig and the build toolchain. NOT runtime code, fs/streams/http (that is nodejs); NOT component/route typing (that is react/nextjs); NOT ORM type-gen (that is drizzle-orm).
Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/build-and-monorepo.md`).
It sits in Databases, covering Type safety, ORMs and data access and React components. It works with TypeScript, React, Node.js and Next.js. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 92fde8f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
tscnpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Typescript loads about 2.8k tokens when it runs, and up to ~5.6k if it reads all its reference files. Until then it costs about 89 tokens; SKILL.md has 928 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 928 words, ~2,762 tokens.
.claude/skills/typescript/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Express data and contracts precisely in the TypeScript type system, and configure the compiler so the types actually hold.
Targets TypeScript 5.9 (current stable, Q1 2026): redesigned tsc --init defaults
(module: nodenext, target: esnext, moduleDetection: force, strict on), import defer
for deferred module evaluation, expandable editor hovers. The TypeScript 7 native
compiler (tsgo, the Go port) is in preview as @typescript/native-preview and
type-checks roughly 10x faster (VS Code's 1.5M LOC: 89s -> 8.74s) — adopt it for fast
local checks; stable 7.0 lands early 2026.
Three layers, three owners. Language + compiler config lives here — generics, narrowing,
.d.ts, tsconfig, and the build toolchain (tsc vs tsgo, tsx, resolution mode).
Runtime behavior (how a stream backpressures, how the event loop schedules) is nodejs.
Framework idioms (component props, route maps, server-component typing) are
react/nextjs/nestjs — those borrow this skill's type mechanics but own their wiring.
A tsconfig question is here; a "stream backpressure" question is nodejs; a "type my
useReducer state" question is react. Also delegate: ORM schema-to-type generation ->
drizzle-orm / prisma-orm; REST/contract shape design -> api-design; test runner and E2E
setup -> testing-web / e2e-testing; injection/authz review -> secure-coding; Python
typing -> python; Go -> go.
Apply these on every TypeScript edit:
.d.ts. Why: redundant annotations drift from
reality and suppress the better inferred type.import type for type-only imports, with verbatimModuleSyntax: true. Why: it
prevents emitting type-only imports as runtime requires and lets esbuild/swc transpile
each file alone.in, typeof, discriminant checks before
as; when as is unavoidable, only as <narrower> or as unknown as T at a true I/O
boundary. Why: as asserts a claim the compiler cannot verify — it is a silenced error,
and as to a wider or unrelated type is almost always a real bug hidden.const type parametersConstrain type parameters so callers get errors at the call site, and use a const type
parameter (TS 5.0+) to preserve literal inference without as const everywhere:
// Bad: unconstrained T, and the literal "a"|"b" widens to string.
function pick<T>(obj: T, key: string) { return (obj as any)[key]; }
// Good: K is constrained to obj's keys; const T keeps the literal union.
function pick<const T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const r = pick({ a: 1, b: "x" } as const, "b"); // r: "x", not stringunknown over any at every boundaryany disables checking and silently poisons every downstream type it touches; unknown
forces a narrow before use.
// Bad: any flows everywhere, no error ever fires downstream.
function parse(json: string): any { return JSON.parse(json); }
// Good: unknown forces a narrow before the value is trusted.
function parse(json: string): unknown { return JSON.parse(json); }
const data = parse(input);
if (typeof data === "object" && data && "id" in data) { /* now narrowed */ }satisfies for config validation without wideningtype Route = { path: string; method: "GET" | "POST" };
// Bad: annotation widens — routes.home.method is "GET" | "POST", and a typo in
// a key would only surface far away.
const a: Record<string, Route> = { home: { path: "/", method: "GET" } };
// Good: satisfies validates each entry AND keeps literal types.
const routes = {
home: { path: "/", method: "GET" },
} satisfies Record<string, Route>;
routes.home.method; // "GET" (narrow), and "GE" would error right hereneverModel state as a discriminated union, not an optional-field bag:
{ data?: T; error?: E; loading?: boolean } permits loading && error; a literal discriminant
makes illegal states unrepresentable. That discriminant must be a literal type (not
string), and you must check it before destructuring — destructuring first throws away
the narrowing.
type State =
| { status: "loading" }
| { status: "ok"; data: string }
| { status: "error"; message: string };
// Bad: destructured before the check — `data`/`message` are typed as the union.
function render({ status, data, message }: State) { /* no narrowing */ }
// Good: switch on the literal discriminant, exhaustive never guard at the end.
function render(s: State): string {
switch (s.status) {
case "loading": return "...";
case "ok": return s.data;
case "error": return s.message;
default: { const _exhaustive: never = s; return _exhaustive; }
}
}Add a "deleted" member to State and the default branch fails to compile — that is the
point.
TS is structural, so a UserId and a raw string are interchangeable unless you brand them:
type UserId = string & { readonly __brand: "UserId" };
const asUserId = (s: string): UserId => s as UserId; // brand only at the validated boundary
function load(id: UserId) { /* a bare string is now a compile error */ }Partial<T> Required<T> Readonly<T> Pick<T,K> Omit<T,K> Record<K,V>
Exclude<U,M> Extract<U,M> NonNullable<T> ReturnType<F> Parameters<F>
Awaited<T> NoInfer<T> (TS 5.4+, blocks a type param from inferring at one site).
type Mutable<T> = { -readonly [K in keyof T]: T[K] }; // strip readonly
type Nullable<T> = { [K in keyof T]: T[K] | null }; // mapped transform
type Unwrap<T> = T extends Promise<infer U> ? U : T; // conditional + infer
type EventName<T extends string> = `on${Capitalize<T>}`; // template literalDeep recipes (recursive types, declaration merging, variance/in-out, assertion functions,
overloads) live in references/type-system.md.
Copy-paste base. Every package extends this and overrides only paths/references:
{
"compilerOptions": {
"strict": true, // the whole strict family, non-negotiable
"noUncheckedIndexedAccess": true, // arr[i] / rec[k] are T | undefined
"verbatimModuleSyntax": true, // explicit import type; safe single-file transpile
"isolatedModules": true, // each file transpilable alone (esbuild/swc/babel)
"skipLibCheck": true, // don't type-check node_modules .d.ts (speed)
"resolveJsonModule": true, // import data.json with types
"target": "esnext",
"module": "nodenext", // or "esnext" + "moduleResolution": "bundler"
"moduleResolution": "nodenext",
"moduleDetection": "force",
"noEmit": true // a bundler/tsc -b emits; the base just checks
}
}| Aspect | bundler | nodenext |
|---|---|---|
| Use when | Vite / Next / Remix / esbuild build the code | Code runs directly in Node (no bundler) |
| Relative import extensions | omit (./util) | required (./util.js) |
package.json exports/imports | resolved | resolved |
module setting | esnext/preserve | nodenext |
| Emits runnable JS itself | no (the bundler does) | yes |
Pick bundler when a bundler owns resolution; pick nodenext for libraries and scripts
that Node executes directly. Field-by-field reference and the full matrix are in
references/build-and-monorepo.md.
Use project references so packages type-check independently and in dependency order. A
shared tsconfig.base.json holds the strict flags; each package extends it, sets
composite: true, outDir/rootDir, and lists upstream packages under references. Build
the graph with tsc -b (or tsgo -b).
For declaration emit and publishing a library, set declaration: true,
declarationMap: true, and an exports map in package.json. For fast local checks prefer
tsgo (TS7 preview: npx @typescript/native-preview); run scripts with tsx instead of
ts-node. Depth, build-order graph, path aliases, and the tsgo adoption steps are in
references/build-and-monorepo.md.
| Anti-pattern | Why it bites | Do instead |
|---|---|---|
any as an escape hatch | disables all checking and spreads silently downstream | unknown + narrow, or a precise type / generic |
as to silence "not assignable" | asserts a claim TS can't verify — hides the real bug | fix the type, or narrow with a guard/in/typeof |
enum for a small fixed set | emits runtime code, awkward with isolatedModules, no literal subtyping | union of string literals ("a" | "b") + as const |
| Destructure before the discriminant check | narrowing is lost; fields become the full union | check obj.kind first, then read fields |
Skipping noUncheckedIndexedAccess | arr[i]/rec[k] typed as T but are undefined at runtime | enable it; handle the | undefined |
Function / bare object / {} types | accept almost anything, no call-signature safety | a precise signature, or Record<string, unknown> |
No exhaustive never guard on unions | a new union member compiles with a missing branch | default: const _: never = x in every switch |
One giant tsconfig for a monorepo | can't express per-package targets; breaks references | tsconfig.base.json + per-package extends |
// @ts-ignore | swallows the error even after the line is fixed, masking new ones | // @ts-expect-error (errors if the line later type-checks) |
Default-importing in a CJS-emit file under verbatimModuleSyntax | blocked / wrong emit | use export =/named, or set the right module |
When working inside a real workspace, record this project's tsconfig and strictness choices (resolution mode, which strict flags are on, the build tool) in the project wiki via ../harness/SKILL.md — so the next session does not re-derive them.
© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts, references) in skills/typescript of ericrisco/rsc-harness.
Open the folder on GitHubat commit 92fde8f
Typescript next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Typescript this skillericrisco/rsc-harness | 156 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Spiceflowremorses/spiceflow | 167 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Fetching Library Docsaiskillstore/marketplace | 430 | 1 repos | ~1.6k | Automated safety check: Pass | None | |
| Spotpatchhuanglvjing/spotpatch | 134 | — | ~998 | Automated safety check: Pass | MIT | |
| Drizzle Ormgrowupanand/ConvoForm | 101 | 1 repos | ~2.7k | Automated safety check: Pass | Apache-2.0 | |
| Drizzle Orm Expertdavila7/claude-code-templates | 32k | 3 repos | ~2.6k | Automated safety check: Pass | MIT |
remorses/spiceflow
Spiceflow is a super simple, fast, and type-safe API and React Server Components framework for TypeScript.
aiskillstore/marketplace
Token-efficient library API documentation fetcher using Context7 MCP with 77% token savings.
huanglvjing/spotpatch
为 React 项目建立从浏览器页面元素到精确 JSX/TSX 源码、结构化上下文与可审阅修改的 SpotPatch 工作流。用户提到 SpotPatch、截图沟通前端修改、页面元素定位源码、Vite 或 Next.js 接入、组件数据链路、结构化 Prompt、AI 补丁审阅、安装检查或故障排查时使用此技能。
growupanand/ConvoForm
Type-safe SQL ORM for TypeScript with zero runtime overhead. An agent skill from growupanand/ConvoForm.
davila7/claude-code-templates
Expert in Drizzle ORM for TypeScript — schema design, relational queries, migrations, and serverless database integration.
aiskillstore/marketplace
Token-efficient library documentation fetcher using Context7 MCP with 86.8% token savings through intelligent shell pipeline filtering.
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Works with
Categories
A skill your agent uses when writing or fixing TypeScript type code (.ts/.tsx/.d.ts), modeling data with generics/unions/branded types, diagnosing narrowing failures, or configuring tsconfig and the…. Typescript is an agent skill from ericrisco/rsc-harness.ts), modeling data with generics/unions/branded types, diagnosing narrowing failures, or configuring tsconfig and the build toolchain.
Typescript fits situations like: fixing TypeScript type code (.ts/.tsx/.d.ts); modeling data with generics/unions/branded types; diagnosing narrowing failures; configuring tsconfig and the build toolchain.
Run `npx skills add ericrisco/rsc-harness --skill typescript -a claude-code`. Or copy the skill folder (skills/typescript in ericrisco/rsc-harness) into .claude/skills/typescript in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill typescript -a codex`. Or copy the skill folder (skills/typescript in ericrisco/rsc-harness) into .agents/skills/typescript in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill typescript -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/typescript, .gemini/skills/typescript, .github/skills/typescript and .opencode/skills/typescript in your project.
Going by SKILL.md and its folder, Typescript needs a shell for the scripts in its folder and the command-line tools its instructions call (tsc and npx). Our summary lists: Python 3; Node.js; A Bash shell.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Typescript is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Typescript: Spiceflow (remorses/spiceflow, 167 stars), Fetching Library Docs (aiskillstore/marketplace, 430 stars), Spotpatch (huanglvjing/spotpatch, 134 stars) and Drizzle Orm (growupanand/ConvoForm, 101 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.