Effect TS
mattiacerutti/supernova
Write idiomatic Effect v4 TypeScript following official best practices from effect-solutions and the Effect source.
Write idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source.
$ npx skills add tellahq/opensession --skill effect-ts -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tellahq/opensession effect-ts --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/tellahq/opensession.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/effect-ts .claude/skills/effect-ts && 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 "effect-ts" agent skill from https://github.com/tellahq/opensession/tree/main/.agents/skills/effect-ts into .claude/skills/effect-ts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "effect-ts", 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/tellahq/opensession/tree/main/.agents/skills/effect-tsType 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 tellahq/opensession --skill effect-ts -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tellahq/opensession effect-ts --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tellahq/opensession.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/effect-ts .agents/skills/effect-ts && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "effect-ts" agent skill from https://github.com/tellahq/opensession/tree/main/.agents/skills/effect-ts into .agents/skills/effect-ts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "effect-ts", 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 tellahq/opensession --skill effect-ts -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tellahq/opensession effect-ts --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tellahq/opensession.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/effect-ts .cursor/skills/effect-ts && 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 "effect-ts" agent skill from https://github.com/tellahq/opensession/tree/main/.agents/skills/effect-ts into .cursor/skills/effect-ts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "effect-ts", 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/tellahq/opensession.git --path .agents/skills/effect-ts--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 tellahq/opensession --skill effect-ts -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tellahq/opensession effect-ts --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tellahq/opensession.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/effect-ts .gemini/skills/effect-ts && 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 "effect-ts" agent skill from https://github.com/tellahq/opensession/tree/main/.agents/skills/effect-ts into .gemini/skills/effect-ts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "effect-ts", 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 tellahq/opensession effect-tsInstalls 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 tellahq/opensession --skill effect-ts -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tellahq/opensession.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/effect-ts .github/skills/effect-ts && 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 "effect-ts" agent skill from https://github.com/tellahq/opensession/tree/main/.agents/skills/effect-ts into .github/skills/effect-ts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "effect-ts", 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 tellahq/opensession --skill effect-ts -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tellahq/opensession effect-ts --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tellahq/opensession.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/effect-ts .opencode/skills/effect-ts && 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 "effect-ts" agent skill from https://github.com/tellahq/opensession/tree/main/.agents/skills/effect-ts into .opencode/skills/effect-ts/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "effect-ts", 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.
effect-tsWrite idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source.
Effect TS is an agent skill from tellahq/opensession. Write idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source. Use when writing, reviewing, or refactoring Effect code: services (Context.Service), layers, error handling (Schema.TaggedError, Effect.catch/catchTag), data modeling (Schema.Class, brands, TaggedClass unions), retries and polling (Schedule, Effect.retry/repeat), resources and fibers (Scope, FiberMap, forkScoped), testing (bun:test + TestClock, or @effect/vitest), HTTP clients, CLI, config, and the Open Session frontend…
Its SKILL.md is about 3.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files, including reference files (for example `references/cli.md`, `references/config.md` and `references/data-modeling.md`).
It sits in Testing & QA, covering Unit testing, Database schema design and Refactoring. It works with Vitest, React and TypeScript. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1524bbb. 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.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom 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.
Effect TS loads about 3.7k tokens when it runs, and up to ~25k if it reads all its reference files. Until then it costs about 187 tokens; SKILL.md has 914 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); files beside SKILL.md are not scanned.
The full file from tellahq/opensession at commit 1524bbb, republished under its MIT licence (© tellahq). 914 words, ~3,740 tokens.
.claude/skills/effect-ts/SKILL.md (or your agent's skills folder). This skill also uses 11 other files; get the full folder from GitHub.4.0.0-rc.112)Every API name in this skill was checked against node_modules/effect/dist/*.d.ts
at 4.0.0-rc.112 and the Effect repository at tag effect@4.0.0-rc.112
(LLMS.md, ai-docs/src, migration/). Patterns come from the official
ai-docs and the Effect team's LLMS.md, not from third-party summaries.
Originally derived from joelhooks/effectts-skills (MIT), which targeted an
early v4 beta and still uses ServiceMap.Service, Schema.TaggedErrorClass,
Schedule.compose, and @effect/vitest-only testing. Those names do not exist
in rc.112. This copy was rewritten on 2026-09-03; the rename map below records
what changed.
Never guess an Effect v4 API. v4 renamed modules between betas and the RC line still moves. Before writing or reviewing Effect code:
grep '"effect"' packages/core/opensession-server/package.json..agent-sources/effect/, checked out at the
matching tag (git -C .agent-sources/effect describe --tags must print
effect@4.0.0-rc.112). If it is missing or on main:mkdir -p .agent-sources
git clone --depth 1 --branch effect@4.0.0-rc.112 https://github.com/Effect-TS/effect.git .agent-sources/effect.git/info/exclude; never commit it.
main is ahead of the pin (it already has Config.String where rc.112
has Config.string), so a tag checkout is required, not optional.LLMS.md (curated patterns),
ai-docs/src/** (runnable examples), migration/*.md (v3 to v4 rename
tables), then packages/effect/src/<Module>.ts for signatures and JSDoc.Quick checks:
grep -n "^export declare const retry:" node_modules/effect/dist/Effect.d.ts
grep -rn "Schedule.while" .agent-sources/effect/ai-docs/src| Older name (v3 or early v4 beta) | rc.112 |
|---|---|
ServiceMap.Service (beta < 44) | Context.Service |
Context.Tag, Effect.Tag, Effect.Service (v3) | Context.Service<Self, Shape>()(id) |
Schema.TaggedErrorClass, Schema.ErrorClass (beta < 104) | Schema.TaggedError, Schema.Error |
Effect.catchAll / catchAllCause / catchAllDefect | Effect.catch / catchCause / catchDefect |
Effect.catchSome | Effect.catchFilter |
Effect.fork / Effect.forkDaemon | Effect.forkChild / Effect.forkDetach |
FiberRef, Effect.locally | Context.Reference, Effect.provideService |
Schedule.compose(...) | never existed in v4; use Effect.retry(eff, { schedule, times, while }), Schedule.max([...]), Schedule.while |
Effect.withConcurrency(n) | { concurrency: n } option on Effect.all / Effect.forEach |
Schema.minLength / maxLength / pattern / UUID | Schema.check(Schema.isMinLength(n)), isMaxLength, isPattern, isUUID |
Schema.Defect (value) | Schema.Defect() (call) |
Hash.cached | removed; use Hash.string, Hash.combine |
Scope.extend(scope) | Scope.provide(scope) |
ConfigProvider.fromJson | ConfigProvider.fromUnknown |
Config.String / Config.Redacted (post-rc.112 main) | Config.string / Config.redacted |
Prefer Effect.gen for inline code and Effect.fn("name") for reusable
functions (it names the span and improves stack traces). Use
Effect.fnUntraced for hot paths and library internals. Do not write a
function whose only job is to return an Effect.gen.
import { Effect, Schema } from "effect"
export class SomeError extends Schema.TaggedError<SomeError>()("SomeError", {
message: Schema.String
}) {}
export const effectFunction = Effect.fn("effectFunction")(
function*(n: number): Effect.fn.Return<string, SomeError> {
yield* Effect.logInfo("Received number:", n)
// Always `return yield*` when raising so TypeScript knows the function stops.
return yield* new SomeError({ message: "Failed" })
},
// Extra arguments add combinators. Do not `.pipe` the result of Effect.fn.
Effect.catch((error) => Effect.logError(`An error occurred: ${error}`)),
Effect.annotateLogs({ method: "effectFunction" })
)import { Context, Effect, Layer, Schema } from "effect"
export class DatabaseError extends Schema.TaggedError<DatabaseError>()("DatabaseError", {
cause: Schema.Defect()
}) {}
export class Database extends Context.Service<Database, {
query(sql: string): Effect.Effect<Array<unknown>, DatabaseError>
}>()("myapp/db/Database") {
static readonly layer = Layer.effect(
Database,
Effect.gen(function*() {
const query = Effect.fn("Database.query")(function*(sql: string) {
yield* Effect.log("Executing SQL query:", sql)
return [{ id: 1, name: "Alice" }]
})
return Database.of({ query })
})
)
}
export type DatabaseService = Database["Service"]Rules: type parameters first, identifier string second (<Self, Shape>()(id));
identifiers are package/path/Name; methods have R = never; name the primary
layer layer and variants layerTest, layerSqlite; prefer yield* Service
over Service.use(...) so dependencies stay visible. Context.Reference<T>(id, { defaultValue }) defines a service with a default (flags, config, log level).
See references/services-and-layers.md.
import { Match, Schema } from "effect"
const UserId = Schema.String.pipe(Schema.brand("UserId"))
type UserId = typeof UserId.Type
export class User extends Schema.Class<User>("app/User")({
id: UserId,
name: Schema.NonEmptyString,
role: Schema.Literals(["admin", "member"])
}) {
get label() { return `${this.name} (${this.role})` }
}
class Success extends Schema.TaggedClass<Success>()("Success", { value: Schema.Number }) {}
class Failure extends Schema.TaggedClass<Failure>()("Failure", { error: Schema.String }) {}
const Result = Schema.Union([Success, Failure])
type Result = typeof Result.Type
const render = (r: Result) => Match.valueTags(r, {
Success: ({ value }) => `Got: ${value}`,
Failure: ({ error }) => `Error: ${error}`
})
export const decodeUser = Schema.decodeUnknownEffect(User)Schema.Class<Self>(identifier)(fields) and Schema.TaggedClass<Self>()(tag, fields) require the Self type parameter; omitting it is a compile error.
Default to Schema.Struct for plain DTOs. See
references/data-modeling.md and
references/schema-decisions.md.
import { Effect, Schema } from "effect"
export class ParseError extends Schema.TaggedError<ParseError>()("ParseError", {
input: Schema.String
}) {}
export class ReservedPortError extends Schema.TaggedError<ReservedPortError>()("ReservedPortError", {
port: Schema.Int
}) {}
declare const loadPort: (input: string) => Effect.Effect<number, ParseError | ReservedPortError>
export const recovered = loadPort("80").pipe(
Effect.catchTag(["ParseError", "ReservedPortError"], () => Effect.succeed(3000))
)
export const fallback = loadPort("x").pipe(
Effect.catchTag("ReservedPortError", () => Effect.succeed(3000)),
Effect.catch(() => Effect.succeed(3000))
)Errors are yieldable (return yield* new ParseError({...})). Use typed errors
for failures a caller can handle, defects (Effect.orDie, Effect.die) for
bugs, and Schema.Defect() to carry an unknown cause. See
references/error-handling.md.
const appLayer = UserService.layer.pipe(
Layer.provideMerge(Database.layer),
Layer.provideMerge(Logger.layer)
)
Effect.runPromise(program.pipe(Effect.provide(appLayer)))Layer.provide satisfies and hides; Layer.provideMerge satisfies and
exposes; Layer.mergeAll combines siblings. Layers memoize by reference, so
store parameterized layers in constants. Provide once at the entry point.
import { Effect, Schedule } from "effect"
// Capped exponential backoff with jitter, only while the error is retryable.
export const productionRetry = Schedule.min([
Schedule.exponential("250 millis"),
Schedule.spaced("10 seconds")
]).pipe(
Schedule.jittered,
Schedule.setInputType<HttpError>(),
Schedule.while(({ input }) => input.retryable)
)
export const loadUser = fetchUserProfile("u1").pipe(
Effect.retry(productionRetry),
Effect.timeout("30 seconds")
)
// Or the options form: schedule + attempt cap + predicate in one place.
export const loadUser2 = fetchUserProfile("u1").pipe(
Effect.retry({ schedule: Schedule.exponential("1 second"), times: 5, while: (e) => e.retryable })
)
// Attempt cap: Schedule.max continues only while all inputs continue.
export const sixAttempts = Schedule.max([Schedule.exponential("250 millis"), Schedule.recurs(6)])
// Polling: repeat a successful effect on a cadence.
export const poll = healthCheck.pipe(Effect.repeat(Schedule.spaced("1 second")))Effect.retry always runs the effect once before consulting the policy;
defects and interrupts are never retried.
Effect.acquireRelease(acquire, release) inside a Layer.effect ties a
resource to the layer's scope.Effect.forkScoped for background work that must die with the scope;
Effect.forkChild for work that dies with the parent fiber;
Effect.forkDetach only when you own the cleanup.Effect.scoped closes an inline scope; Scope.make() + Scope.provide(scope)Scope.close(scope, Exit.void) when a host controls the lifetime.FiberMap keeps keyed fibers where setting a key interrupts the previous one.Effect.callback and return a finalizer so
interruption cancels the source; Effect.tryPromise((signal) => ...) hands
you an AbortSignal that fires on interruption.Effect code composes; hosts run it. Effect.runPromise / runFork /
runSync at the edge, ManagedRuntime.make(layer) when a framework needs a
long-lived runtime, Layer.launch for a process entry point. Never run an
Effect inside a React render.
This repository uses bun:test, not @effect/vitest:
import { expect, test } from "bun:test"
import * as Effect from "effect/Effect"
import * as Fiber from "effect/Fiber"
import * as TestClock from "effect/testing/TestClock"
test("delays are deterministic under TestClock", async () => {
const program = Effect.gen(function*() {
const fiber = yield* Effect.forkChild(Effect.sleep("20 seconds").pipe(Effect.as("done")))
yield* TestClock.adjust("19 seconds")
yield* TestClock.adjust("1 second")
expect(yield* Fiber.join(fiber)).toBe("done")
})
await Effect.runPromise(Effect.provide(program, TestClock.layer()))
})Provide fresh layers per test with Effect.provide; assert errors with
Effect.flip or Effect.exit. @effect/vitest (it.effect, it.live,
it.layer) applies only to vitest projects. See
references/testing.md.
| Do not | Do instead |
|---|---|
console.log inside Effect code | Effect.log / logInfo with structured data |
process.env.KEY | Config.string("KEY"), Config.redacted("KEY") |
throw inside Effect.gen | return yield* new TaggedError({...}) |
Effect.runSync / runPromise inside services | keep everything effectful; run at the edge |
Effect.catch when only one tag matters | Effect.catchTag / catchTags |
try/catch around yield* | Effect.try, Effect.tryPromise, catch* |
hand-rolled isString/isRecord | Predicate.isString, Predicate.isObject |
null/undefined in domain types | Option, Effect.fromNullishOr |
Date.now() in Effect code | Clock.currentTimeMillis / DateTime.now (testable) |
Schedule.compose, ServiceMap, TaggedErrorClass, catchAll, forkDaemon | see the rename map |
| inline parameterized layer constructors | store the layer in a constant (memoization) |
import { Effect } from "effect" in the browser bundle | import * as Effect from "effect/Effect" (enforced by effect-imports.test.ts) |
Effect is adopted in the web frontend only, behind plain runtime objects with
configure/start/stop; the server, SessionKernel, and native clients have no
Effect. Read references/open-session-frontend.md
before touching lib/effect-lifecycle.ts, lib/session-socket-runtime.ts,
lib/session-list-runtime.ts, hooks/useWebSocket.ts, or hooks/useSessions.ts.
use/make, layer composition, memoization, test layers© tellahq, 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 11 other files (references) in .agents/skills/effect-ts of tellahq/opensession.
Open the folder on GitHubat commit 1524bbb
Effect TS 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 |
|---|---|---|---|---|---|---|
| Effect TS this skilltellahq/opensession | 392 | — | ~3.7k | Automated safety check: Pass | MIT | |
| Effect TSmattiacerutti/supernova | 187 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Effect TSpproenca/dot-skills | 214 | — | ~2k | Automated safety check: Pass | MIT | |
| Typescript Idiomsirahardianto/awesome-agv | 157 | — | ~6.1k | Automated safety check: Pass | MIT | |
| Vue Idiomsirahardianto/awesome-agv | 157 | — | ~6k | Automated safety check: Pass | MIT | |
| Formax Tool UI Blocks Workflowyusifeng/formax | 195 | — | ~1.3k | Automated safety check: Pass | MIT |
mattiacerutti/supernova
Write idiomatic Effect v4 TypeScript following official best practices from effect-solutions and the Effect source.
pproenca/dot-skills
Effect-TS library usage in TypeScript — Effect.gen generators, Schema.Struct/Schema.Class definitions, Layer/Context.Tag/Service patterns, Effect.pipe pipelines, Data.TaggedError/Data.Class error…
irahardianto/awesome-agv
TypeScript strict typing: type narrowing, discriminated unions, Zod runtime validation, generic utility types, and Vitest testing.
irahardianto/awesome-agv
Vue 3 Composition API patterns: <script setup syntax, reactive state with Pinia stores, reusable composables, and Vitest component testing.
yusifeng/formax
Implement or refactor Formax tool transcript UI using the Tool UI Blocks (C-lite) pattern (ToolUiBlocks renderer + blocks presenters) to avoid touching many tool presenter files; use when adjusting…
shinpr/ai-coding-project-boilerplate
Designs frontend tests using the repository's configured React test and browser harnesses, including RTL, MSW, Vitest, and Playwright when present.
tellahq/opensession
Spawn three parallel review child sessions over the active transcript, surface learnings, and route each to a concrete edit on an existing skill.
tellahq/opensession
Help the user understand the current topic visually with concise diagrams, code-shape sketches, and focused HTML artifacts.
tellahq/opensession
A skill your agent uses for "automate me", "create/update/refresh my -mode skill", "turn/capture my preferences or working style into a skill", or wanting agents to follow how the user works.
tellahq/opensession
Auto-fix a PR — address ALL reviewers' open feedback + failing CI, push, and reply in each addressed thread with honest attribution
tellahq/opensession
Fan out N parallel workers, drain them, and return one report.
tellahq/opensession
Drive the Open Session web UI against an isolated demo server and capture proof for session, workspace, automation, goal, archive, or settings changes.
Works with
Categories
Write idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source. Effect TS is an agent skill from tellahq/opensession.112 source.
Effect TS fits situations like: refactoring Effect code: services (Context.Service); error handling (Schema.TaggedError; effect.catch/catchTag); data modeling (Schema.Class.
Run `npx skills add tellahq/opensession --skill effect-ts -a claude-code`. Or copy the skill folder (.agents/skills/effect-ts in tellahq/opensession) into .claude/skills/effect-ts in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tellahq/opensession --skill effect-ts -a codex`. Or copy the skill folder (.agents/skills/effect-ts in tellahq/opensession) into .agents/skills/effect-ts 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 tellahq/opensession --skill effect-ts -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/effect-ts, .gemini/skills/effect-ts, .github/skills/effect-ts and .opencode/skills/effect-ts in your project.
Going by SKILL.md and its folder, Effect TS needs the command-line tools its instructions call (git).
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. 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. Review the folder before installing.
Effect TS is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.7k tokens (SKILL.md is roughly 15k 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 21k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Effect TS: Effect TS (mattiacerutti/supernova, 187 stars), Effect TS (pproenca/dot-skills, 214 stars), Typescript Idioms (irahardianto/awesome-agv, 157 stars) and Vue Idioms (irahardianto/awesome-agv, 157 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tellahq (a GitHub organization) maintains it in tellahq/opensession, which has 392 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 7, 2026.
Source: tellahq/opensession on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.