Agent skill

Effect TS

by tellahq in tellahq/opensession

Write idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source.

MITAuto-check passedTesting & QA

Install Effect TS

skills CLI
$ npx skills add tellahq/opensession --skill effect-ts -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tellahq/opensession effect-ts --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
effect-ts
GitHub stars
392
Token cost
~3.7k tokens
SKILL.md length
914 words
Files
12 (incl. references)
Skills in repo
15
Repo updated
First seen
Licence
MIT

At a glance

Write idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source.

  • Works in 4 steps: Confirm the pin: grep '"effect"'… → Use the repo-local mirror at… → Read the official guidance in this… → …
  • Refactoring Effect code: services (Context.Service)
  • SKILL.md covers Source-first rule, Rename map (what older docs…, Effect.gen and Effect.fn and Context.Service, plus 10 more sections
  • Calls git; reaches github.com

What it does

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.

When your agent uses it

  • Refactoring Effect code: services (Context.Service)
  • Error handling (Schema.TaggedError
  • Effect.catch/catchTag)
  • Data modeling (Schema.Class

Example prompts

  • “Effect”
  • “effect-ts”
  • “@effect/”
  • “/effect-ts”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. Confirm the pin: grep '"effect"' packages/core/opensession-server/package.json.
  2. Use the repo-local mirror at .agent-sources/effect/, checked out at the
  3. Read the official guidance in this order: LLMS.md (curated patterns),
  4. When a snippet here and the source disagree, the source wins. Fix the

What it can do on your machine

Read from SKILL.md and the folder at commit 1524bbb. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~187
When it runs · the whole SKILL.md, loaded when a task matches
~3.7k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~25k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from tellahq/opensession at commit 1524bbb, republished under its MIT licence (© tellahq). 914 words, ~3,740 tokens.

Download SKILL.mdSave it as .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.
name
effect-ts
description
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 lifecycle runtimes. Triggers on: 'Effect', 'effect-ts', '@effect/', 'Schema', 'Context.Service', 'Layer', 'Effect.gen', 'Effect.fn', 'TaggedError', 'Schedule', 'FiberMap', 'TestClock', 'atom-react', or any Effect-TS code.

Effect-TS (v4, pinned to 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.

Source-first rule

Never guess an Effect v4 API. v4 renamed modules between betas and the RC line still moves. Before writing or reviewing Effect code:

  1. Confirm the pin: grep '"effect"' packages/core/opensession-server/package.json.
  2. Use the repo-local mirror at .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:
    bash
    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
    The mirror is excluded through .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.
  3. Read the official guidance in this order: 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.
  4. When a snippet here and the source disagree, the source wins. Fix the snippet.

Quick checks:

bash
grep -n "^export declare const retry:" node_modules/effect/dist/Effect.d.ts
grep -rn "Schedule.while" .agent-sources/effect/ai-docs/src

Rename map (what older docs and skills get wrong)

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 / catchAllDefectEffect.catch / catchCause / catchDefect
Effect.catchSomeEffect.catchFilter
Effect.fork / Effect.forkDaemonEffect.forkChild / Effect.forkDetach
FiberRef, Effect.locallyContext.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 / UUIDSchema.check(Schema.isMinLength(n)), isMaxLength, isPattern, isUUID
Schema.Defect (value)Schema.Defect() (call)
Hash.cachedremoved; use Hash.string, Hash.combine
Scope.extend(scope)Scope.provide(scope)
ConfigProvider.fromJsonConfigProvider.fromUnknown
Config.String / Config.Redacted (post-rc.112 main)Config.string / Config.redacted

Effect.gen and Effect.fn

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.

ts
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" })
)

Context.Service

ts
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.

Schema: Class, brands, and variants

ts
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.

Errors: Schema.TaggedError and catch*

ts
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.

Layers

ts
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.

Retry, repeat, and timeout with Schedule

ts
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.

Show full SKILL.md (398 more words)Show less

Resources, scopes, and fibers

  • 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.
  • Wrap callback APIs with Effect.callback and return a finalizer so interruption cancels the source; Effect.tryPromise((signal) => ...) hands you an AbortSignal that fires on interruption.

See references/processes.md.

Running at the boundary

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.

Testing quick start

This repository uses bun:test, not @effect/vitest:

ts
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.

Anti-patterns

Do notDo instead
console.log inside Effect codeEffect.log / logInfo with structured data
process.env.KEYConfig.string("KEY"), Config.redacted("KEY")
throw inside Effect.genreturn yield* new TaggedError({...})
Effect.runSync / runPromise inside serviceskeep everything effectful; run at the edge
Effect.catch when only one tag mattersEffect.catchTag / catchTags
try/catch around yield*Effect.try, Effect.tryPromise, catch*
hand-rolled isString/isRecordPredicate.isString, Predicate.isObject
null/undefined in domain typesOption, Effect.fromNullishOr
Date.now() in Effect codeClock.currentTimeMillis / DateTime.now (testable)
Schedule.compose, ServiceMap, TaggedErrorClass, catchAll, forkDaemonsee the rename map
inline parameterized layer constructorsstore the layer in a constant (memoization)
import { Effect } from "effect" in the browser bundleimport * as Effect from "effect/Effect" (enforced by effect-imports.test.ts)

Open Session specifics

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.

Reference files

  • Open Session frontend: where Effect lives, the React boundary, tests, bundle budget, what stays native, ranked next steps
  • Services & Layers: Context.Service, Reference, use/make, layer composition, memoization, test layers
  • Data Modeling: Schema.Class, brands, TaggedClass unions, JSON, checks
  • Schema Decisions: Struct vs Class vs TaggedClass
  • Error Handling: TaggedError, catch/catchTag/catchTags/catchFilter/catchReason, defects, Schema.Defect
  • Testing: bun:test + TestClock, layers in tests, Effect.flip, Reference overrides, @effect/vitest for vitest projects
  • HTTP Clients: HttpClient, request building, schemaBodyJson, retryTransient
  • CLI: Command, Argument, Flag, subcommands
  • Config: Config, ConfigProvider, Redacted, config services
  • Processes & Scopes: fork variants, Scope, acquireRelease, ChildProcess
  • Setup: tsconfig, language service, source mirror

© tellahq, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 11 other files (references) in .agents/skills/effect-ts of tellahq/opensession.

  • SKILL.md
  • references/cli.md
  • references/config.md
  • references/data-modeling.md
  • references/error-handling.md
  • references/http-clients.md
  • references/open-session-frontend.md
  • references/processes.md
  • references/schema-decisions.md
  • references/services-and-layers.md
  • references/setup.md
  • references/testing.md

Open the folder on GitHubat commit 1524bbb

Compare with similar skills

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.

Effect TS compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Effect TS this skilltellahq/opensession392—~3.7kAutomated safety check: PassMIT
Effect TSmattiacerutti/supernova187—~2.8kAutomated safety check: PassMIT
Effect TSpproenca/dot-skills214—~2kAutomated safety check: PassMIT
Typescript Idiomsirahardianto/awesome-agv157—~6.1kAutomated safety check: PassMIT
Vue Idiomsirahardianto/awesome-agv157—~6kAutomated safety check: PassMIT
Formax Tool UI Blocks Workflowyusifeng/formax195—~1.3kAutomated safety check: PassMIT

Similar skills

  • Effect TS

    mattiacerutti/supernova

    Write idiomatic Effect v4 TypeScript following official best practices from effect-solutions and the Effect source.

    187 GitHub stars~2.8k tokensUpdated today
    DevelopmentAuto-check passed
  • Effect TS

    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…

    214 GitHub stars~2k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Typescript Idioms

    irahardianto/awesome-agv

    TypeScript strict typing: type narrowing, discriminated unions, Zod runtime validation, generic utility types, and Vitest testing.

    157 GitHub stars~6.1k tokensUpdated 2 days ago
    Testing & QAAuto-check passed
  • Vue Idioms

    irahardianto/awesome-agv

    Vue 3 Composition API patterns: <script setup syntax, reactive state with Pinia stores, reusable composables, and Vitest component testing.

    157 GitHub stars~6k tokensUpdated 2 days ago
    Testing & QAAuto-check passed
  • 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…

    195 GitHub stars~1.3k tokensUpdated 2 mo ago
    Testing & QAAuto-check passed
  • Frontend Typescript Testing

    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.

    232 GitHub stars~1.5k tokensUpdated 3 days ago
    Testing & QAAuto-check passed

More from tellahq/opensession

All 15 skills in this repo
  • Reflect

    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.

    392 GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Show Me

    tellahq/opensession

    Help the user understand the current topic visually with concise diagrams, code-shape sketches, and focused HTML artifacts.

    392 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Automate Me

    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.

    392 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • PR Autofix

    tellahq/opensession

    Auto-fix a PR — address ALL reviewers' open feedback + failing CI, push, and reply in each addressed thread with honest attribution

    392 GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • Swarm

    tellahq/opensession

    Fan out N parallel workers, drain them, and return one report.

    392 GitHub stars~609 tokensUpdated today
    Auto-check passed
  • Verify Opensession

    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.

    392 GitHub stars~1.8k tokensUpdated today
    Auto-check passed

Questions about Effect TS

What does Effect TS do?

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.

When should I use Effect TS?

Effect TS fits situations like: refactoring Effect code: services (Context.Service); error handling (Schema.TaggedError; effect.catch/catchTag); data modeling (Schema.Class.

How do I install Effect TS in Claude Code?

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.

How do I install Effect TS in Codex?

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.

Can I use Effect TS in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Effect TS need to run?

Going by SKILL.md and its folder, Effect TS needs the command-line tools its instructions call (git).

Does Effect TS access the network?

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.

Is Effect TS safe to install?

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.

What licence does Effect TS use?

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.

How many tokens does Effect TS use?

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.

What are the alternatives to Effect TS?

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.

Who maintains Effect TS?

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.