mcpField
E
effect-v4

effect-v4

github.com/klausborges開発039 回インストール3 日前に更新
リポジトリ

effect-v4 について

effect-v4は、Effect v4を使うプロジェクト向けのコーディングスキルです。インストール済み型定義や該当バージョンのソースでAPIを確認する方針に加え、規約、資料、読み取り専用チェッカーを提供します。

主な機能

  1. 01API確認におけるソースの優先順位
  2. 02Effect v4のコーディング規約
  3. 03タスク別リファレンスガイド
  4. 04読み取り専用の診断チェッカー
  5. 05コンパイラパッチの使用ガイド

活用シーン

  1. 01実装前のEffect API確認
  2. 02サービス、エラー、スキーマの実装
  3. 03付属の診断ルールによるコードレビュー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/klausborges/skilltree --skill effect-v4

インストール後、Claude Code で/effect-v4を入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
assets/
oxlintrc.json
sgconfig.yml
assets/.ast-grep/rules/
no-effect-in-pure-core.yml
no-effectful-ternary.yml
no-layer-memory.yml
no-live-suffix.yml
no-manual-runtime-in-tests.yml
no-v3-effect-either.yml
no-v3-schema-refinements.yml
no-v3-service-tag.yml
no-v3-servicemap.yml
assets/.ast-grep/tests/
no-effect-in-pure-core-test.yml
no-effectful-ternary-test.yml
no-layer-memory-test.yml
no-live-suffix-test.yml
no-manual-runtime-in-tests-test.yml
no-v3-effect-either-test.yml
no-v3-schema-refinements-test.yml
no-v3-service-tag-test.yml
no-v3-servicemap-test.yml
assets/.ast-grep/tests/__snapshots__/
no-effect-in-pure-core-snapshot.yml
no-effectful-ternary-snapshot.yml
no-layer-memory-snapshot.yml
no-live-suffix-snapshot.yml
no-manual-runtime-in-tests-snapshot.yml
no-v3-effect-either-snapshot.yml
no-v3-schema-refinements-snapshot.yml
no-v3-service-tag-snapshot.yml
no-v3-servicemap-snapshot.yml

詳細

Effect v4

Effect v4 はモデルのトレーニングデータにほとんど含まれておらず、effect.website のドキュメントは v3 のものです。思い出した API は正しそうに見えても、実際には間違っています。ベータ版の変更は単調ではありません。他のベータ版で見たパターンは、検証するための手がかりであって事実ではありません。また、公式ドキュメントでさえ、リリース済みのコードに追いついていないことがあります(migration/yieldable.md では、存在しない .asEffect() がいまだに説明されています)。これらとソースコードの記述が異なる場合は、ソースコードを優先してください。

タスクで明示的に変更する場合を除き、確立されたプロジェクトの規約を優先してください。

ソースの規則

推測する前に、次の内容を上から順に確認してください。上にあるものほど権威があります。

  1. プロジェクトにインストールされている node_modules/effect の型定義 — 最終的な判断基準です。
  2. リポジトリにベンダー提供されている場合は、プロジェクトのバージョンに対応するタグの Effect ソースコードの固定チェックアウト。
  3. そのチェックアウトに含まれる公式ドキュメント:LLMS.md、ai-docs/src/**、migration/**、packages/effect/SCHEMA.md。
  4. これらのリファレンスファイル。

Effect のコードを書く前に、プロジェクトで固定されているバージョンを明記してください。

参照するファイル

タスクに必要なものだけを読んでください。

タスク読むファイル
サービスやシームを設ける基準、コーディネーターとストアの分割、コントラクト優先、設計レビューreferences/architecture.md
サービス、レイヤー、DI、provide の場所、Effect.fnreferences/services-layers.md
型付きエラー、捕捉、復旧、欠陥references/errors.md
再試行/繰り返しポリシー、ポーリング、TTL キャッシュreferences/schedule-cache.md
Schema、信頼できない入力の解析、ドメインモデリングreferences/schema-boundaries.md
テスト、フェイク、TestClock、プロパティテストreferences/testing.md
エントリーポイント、ランタイム、Config、CLI、オブザーバビリティreferences/runtime-config.md
v3 コードの移植、または「存在するはず」の APIreferences/v3-to-v4.md
モジュールのパッケージまたはインポートパスreferences/module-paths.md

タスクが複数の項目にまたがる場合は、編集前に該当するファイルをすべて読んでください。

基本方針

状況使用するもの
サービスを定義するclass X extends Context.Service<X, Shape>()("pkg/dir/X") {}
実装を追加するstatic readonly layer = Layer.effect(X, ...) を使い、X.of({...}) を返します
Effect を返す関数に名前を付けるEffect.fn("X.method")(function* () {...})
Effect.fn にコンビネーターを追加する末尾の引数を使います — .pipe は使いません
エラーを定義するclass E extends Schema.TaggedErrorClass<E>()("E", {...}) {}
エラーを発生させるreturn yield* E.make({...}) — return が必要です
捕捉するEffect.catchTag/catchTags。チャネル全体には Effect.catch を使います
外部の原因をラップするcause: Schema.Defect()
信頼できない入力をデコードするSchema.decodeUnknownEffect(S)(input)
スキーマを絞り込む.check(Schema.isMinLength(1))
ドメイン値をモデル化するSchema.Class。構造的な形状には Schema.Struct を使います
設定を読み込むConfig.*。process.env は使いません
現在時刻/乱数Clock、DateTime、Random — Date.now、Math.random は使いません
ファイル、パス、ターミナルコア effect の FileSystem、Path — node:fs は使いません
プログラムを実行するNodeRuntime.runMain/BunRuntime.runMain
テストを書く@effect/vitest の assert を使った it.effect
レイヤーを provide する依存関係を閉じるレイヤーの内部、およびプロセスのルートで一度だけ — それ以外では行いません

レイヤーの命名

layer(本番用) · layerNoDeps(依存関係を RIn に残す) · layerFake · layerTest · layerInProcess · layerInMemoryStore · layerFromEnv

Live のサフィックスは使いません。汎用的な layerMemory も使いません。

強制適用プリセット

このスキルには、以下のルールをチェックする読み取り専用チェッカーが付属しています。レビュー前、または大幅な編集後にプロジェクトに対して実行してください。

nu <path-to-this-skill>/scripts/check-effect.nu <project-dir> [source-paths...]

プリセットを assets/ から読み込み、effect-tsgo の診断、oxlint、ast-grep を実行します。対象には書き込まず、対象にツールがないため実行できないゲートはスキップとして報告します。診断をプロジェクトの tsconfig/エディターに恒久的に組み込むのは、プロジェクト側で行う作業です:npx @effect/tsgo setup。

assets/tsconfig-compiler-options.json は、診断が前提とする厳格さの基準です。tsconfig-language-service.json と併せて拡張してください。strict がなければ noImplicitAny は有効にならず、effectFnImplicitAny は何もせずに終了します。

effect-tsgo patch は 冪等ではありません。インストール済みの tsc バイナリをその場でパッチします。適用済みの場合、tsc --version は +effect-tsgo.<version> というサフィックスを報告します。したがって、サフィックスがない場合、またはインストール済みの @effect/tsgo のバージョンと一致しない場合にのみパッチを適用してください。"prepare": "effect-tsgo patch" だけを設定すると、すでにパッチ済みのコンパイラーに再度パッチが適用されます。

アダプターの例外

アダプターファイルにはベンダー固有の事情が持ち込まれるため、一部の診断はそこで適用を緩める必要があります。必要最小限の範囲で抑制してください。

  • ファイル先頭の // @effect-diagnostics <rule>:off — 推奨する方法です。プロジェクト内のプラグイン overrides エントリーは、--lspconfig で設定を注入するランナーによって破棄されます(プロジェクトのプラグイン設定を 置き換える ためです)。プラグマはどちらの方法でも維持されます。references/runtime-config.md を参照してください。
  • leakingRequirements に限っては、言語サービスで使える JSDoc の例外が 2 つあります。受け渡しが意図された依存関係のインターフェース宣言に @effect-leakable-service を付ける方法と、依存関係を漏らすサービスに @effect-expect-leaking <Type> を付ける方法です。

例外を設けることは、ベンダーとの境界が確かに存在するという主張です。1 つのファイルに複数の例外が必要なら、境界の引き方が誤っています。

禁止事項

  • Effect.gen の内部で try/catch を使わないでください。Effect の失敗を検知できません。代わりに Effect.result を使って分岐してください。
  • async/await や通常の Promise を使わないでください。境界を越えるときは Effect.tryPromise を使ってください。
  • ライブラリーコードで Effect.runPromise/runSync/runFork を呼び出さないでください。
  • 本体が Effect.gen を返すだけの通常の関数を書かないでください。Effect.fn を使ってください。
  • Effect の型付けを回避するために as any、as unknown as、非 null アサーションの !、未検証のキャストを使わないでください。代わりに分岐、解析、または型の絞り込みを行ってください。
  • JSON.parse(x) as T を使わないでください。スキーマを通してデコードしてください。
  • isString のような型ガードを独自に実装しないでください。Predicate を使ってください。
  • リトライ/ポーリングループや TTL キャッシュを独自に実装しないでください。Schedule と Cache を使ってください。
  • 設定、状態、調整、復旧の処理で Effect.orDie を使わないでください。
  • v3 パッケージをインポートしないでください:@effect/platform、@effect/schema、@effect/cli、@effect/rpc、@effect/cluster、@effect/experimental。
  • Context.Tag、Context.GenericTag、Effect.Tag、または ServiceMap という名前のものを使わないでください。いずれも v4 より前、または中間ベータ版の名前です。
  • コンパイルを通すためだけに Layer.mergeAll や provideMerge を使わないでください。

コメント