flags-sdk
Flags SDK(`flags` npm パッケージ)および Vercel Flags を使ったフィーチャーフラグ・A/B テストの実装をガイドするスキルです。`flag()` によるフラグ宣言、`vercelAdapter()` や `vercel flags` CLI の操作、Statsig・LaunchDarkly・PostHog・GrowthBook など各種プロバイダー/アダプターの設定、Next.js(App Router・Pages Router・Middleware)や SvelteKit との統合、静的ページ向けの precompute パターン、Flags Explorer/Toolbar の連携、フラグ値の暗号化・復号など幅広いユースケースに対応します。
description の原文を見る
> Guide for feature flags and A/B tests with the Flags SDK (`flags` npm package) and Vercel Flags. Use when: declaring flags with `flag()`, using `vercelAdapter()` or `vercel flags` CLI (add, list, enable, disable, inspect, archive, rm, sdk-keys), setting up providers/adapters (Vercel, Statsig, LaunchDarkly, PostHog, GrowthBook, Hypertune, Edge Config, OpenFeature, Split, Flagsmith, Reflag, Optimizely, or custom adapters), implementing precompute patterns for static pages, setting up `identify`/`dedupe`, integrating Flags Explorer/Toolbar, working with flags in Next.js (App Router, Pages Router, Middleware) or SvelteKit, writing custom adapters, or encrypting/decrypting flag values. Triggers: feature flags, A/B testing, experimentation, flags SDK, flag adapters, precompute, Flags Explorer, feature gates, flag overrides, Vercel Flags, vercel flags CLI, vercel flags add, vercel flags list, vercel flags enable, vercel flags disable, `flags/next`, `flags/sveltekit`, `flags/react`, `@flags-sdk/*`.
SKILL.md 本文
Flags SDK
Flags SDK (flags npm パッケージ) は、Next.js と SvelteKit 向けのフィーチャーフラグツールキットです。各フィーチャーフラグを呼び出し可能な関数に変え、アダプターを通じてあらゆるフラグプロバイダーで動作し、precompute パターンを使用してページを静的に保ちます。Vercel Flags は初期プロバイダーであり、Vercel ダッシュボードまたは vercel flags CLI からフラグを管理できます。
- ドキュメント:https://flags-sdk.dev
- リポジトリ:https://github.com/vercel/flags
コア概念
コードとしてのフラグ
各フラグは関数として宣言されます。呼び出し位置に文字列キーはありません:
import { flag } from 'flags/next';
export const exampleFlag = flag({
key: 'example-flag',
decide() { return false; },
});
const value = await exampleFlag();
サーバーサイド評価
フラグはサーバーサイドで評価されるため、レイアウトシフトを回避し、ページを静的に保ち、機密性を維持します。ルーティングミドルウェアを precompute パターンと組み合わせて、CDN から静的バリエーションを提供します。
アダプターパターン
アダプターはフラグ宣言の decide と origin を置き換え、フラグをプロバイダーに接続します。Vercel Flags (@flags-sdk/vercel) は初期プロバイダーアダプターです。サードパーティアダプターは Statsig、LaunchDarkly、PostHog などで利用できます。
import { flag } from 'flags/next';
import { vercelAdapter } from '@flags-sdk/vercel';
export const exampleFlag = flag({
key: 'example-flag',
adapter: vercelAdapter(),
});
エージェント ワークフロー:新しいフラグの作成
ユーザーがフィーチャーフラグの作成または追加をリクエストするとき、以下のステップを順番に実行してください。CLI ステップを「次のステップ」として残さないでください — 自分で実行してください。
始める前に
プロジェクトの状態をチェックして、コマンドを調整し、スキップできるステップを判断します:
- どのロックファイルが存在しますか (
pnpm-lock.yaml、package-lock.json、yarn.lock、bun.lockb)? → すべてのパッケージマネージャーコマンドを適応させてください (pnpm add、npm install、yarn add、bun add)。 package.jsonにflagsはありますか? → インストールをスキップしてください (ステップ 1).vercel/ディレクトリが存在しますか? → プロジェクトはリンク済み、ステップ 2 のvercel linkをスキップしてください.env.localにFLAGS=が含まれていますか? → 環境変数は既にプル済み、ステップ 3 をスキップしてくださいflags.ts(またはlib/flags.ts、src/flags.ts) が存在しますか? → 最初から作成するのではなく、それに追加してください (ステップ 4)package.jsonに@vercel/toolbarがありますか? → ツールバーセットアップをスキップしてください (ステップ 6)app/.well-known/vercel/flags/route.tsが存在しますか? → Flags Explorer はすでにセットアップ済み、ステップ 7 をスキップしてください
ステップ
-
パッケージをインストール (
package.jsonにまだない場合):pnpm i flags @flags-sdk/vercel -
フラグを Vercel に登録:
vercel flags add <flag-key> --kind boolean --description "<description>"を実行します。前提条件:
vercel flagsコマンドには、Vercel CLI がインストールされて認証されている必要があります。Vercel CLI がインストールされていない場合は、pnpm i -g vercelを実行してください。認証またはリンクの問題については、vercel-cliスキルを読んで従ってください。インストールされていない場合は、npx skills add https://github.com/vercel/vercel --skill vercel-cliを実行してください。vercel flags addを実行する前に、プロジェクトが Vercel にリンクされていることを確認してください。プロジェクトルートの.vercelディレクトリを確認してください。存在しない場合は、まずvercel linkを実行してください。 -
環境変数をプル:
vercel env pullを実行して、FLAGSとFLAGS_SECRETを.env.localに書き込みます。これらの環境変数がないと、vercelAdapter()はフラグを評価できません。このステップはフラグ作成後に 必須 です。 -
コードでフラグを宣言:
vercelAdapter()を使用してflags.tsに追加してください (ファイルが存在しない場合は作成してください):import { flag } from 'flags/next'; import { vercelAdapter } from '@flags-sdk/vercel'; export const myFlag = flag({ key: 'my-flag', adapter: vercelAdapter(), }); -
フラグを使用:ページまたはコンポーネントで呼び出し、結果に基づいて条件付きでレンダリングします:
import { myFlag } from '../flags'; export default async function Page() { const enabled = await myFlag(); return <div>{enabled ? 'Feature on' : 'Feature off'}</div>; } -
Vercel Toolbar をセットアップ (まだ存在しない場合):
pnpm i @vercel/toolbarを実行next.config.tsをツールバープラグインでラップ- ルートレイアウトで
<VercelToolbar />をレンダリング 完全なコードについては、references/nextjs.md — Toolbar Setupを参照してください。
-
Flags Explorer をセットアップ (まだ存在しない場合):
app/.well-known/vercel/flags/route.tsを作成してください — 以下の Flags Explorer セットアップ セクションを参照してください。
Vercel Flags
Vercel Flags は Vercel のフィーチャーフラグプラットフォームです。Vercel ダッシュボードまたは vercel flags CLI からフラグを作成して管理し、@flags-sdk/vercel アダプターで コードに接続します。Vercel でフラグを作成すると、FLAGS と FLAGS_SECRET 環境変数が自動的に設定されます。
フラグをエンドツーエンドで作成するには、上記の エージェント ワークフロー に従ってください。
完全な Vercel プロバイダーリファレンス — ユーザーターゲティング、vercel flags CLI サブコマンド、カスタムアダプター設定、Flags Explorer セットアップ — については、references/providers.md を参照してください。
フラグの宣言
Vercel Flags を使用する場合、エージェント ワークフロー に示すように vercelAdapter() でフラグを宣言してください。他のプロバイダーについては、references/providers.md を参照してください。以下は一般的な flag() パターンです。
基本的なフラグ
import { flag } from 'flags/next'; // または 'flags/sveltekit'
export const showBanner = flag<boolean>({
key: 'show-banner',
description: 'Show promotional banner',
defaultValue: false,
options: [
{ value: false, label: 'Hide' },
{ value: true, label: 'Show' },
],
decide() { return false; },
});
評価コンテキスト付きフラグ
identify を使用して、リクエストが誰のものかを確立します。返されたエンティティは decide に渡されます:
import { dedupe, flag } from 'flags/next';
import type { ReadonlyRequestCookies } from 'flags';
interface Entities {
user?: { id: string };
}
const identify = dedupe(
({ cookies }: { cookies: ReadonlyRequestCookies }): Entities => {
const userId = cookies.get('user-id')?.value;
return { user: userId ? { id: userId } : undefined };
},
);
export const dashboardFlag = flag<boolean, Entities>({
key: 'new-dashboard',
identify,
decide({ entities }) {
if (!entities?.user) return false;
return ['user1', 'user2'].includes(entities.user.id);
},
});
別のアダプター付きフラグ
アダプターはフラグをサードパーティプロバイダーに接続します。各アダプターは decide と origin を置き換えます:
import { flag } from 'flags/next';
import { statsigAdapter } from '@flags-sdk/statsig';
export const myGate = flag({
key: 'my_gate',
adapter: statsigAdapter.featureGate((gate) => gate.value),
identify,
});
サポートされているすべてのアダプターについては、references/providers.md を参照してください。
キーパラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
key | string | 一意のフラグ識別子 |
decide | function | フラグ値を解決する |
defaultValue | any | decide が undefined を返すか例外をスローした場合のフォールバック |
description | string | Flags Explorer に表示 |
origin | string | プロバイダーダッシュボードでフラグを管理する URL |
options | { label?: string, value: any }[] | 可能な値、precompute + Flags Explorer で使用 |
adapter | Adapter | decide と origin を実装するプロバイダーアダプター |
identify | function | decide の評価コンテキスト (エンティティ) を返す |
Dedupe
共有関数 (特に identify) を dedupe でラップして、リクエストごとに一度だけ実行します:
import { dedupe } from 'flags/next';
const identify = dedupe(({ cookies }) => {
return { user: { id: cookies.get('uid')?.value } };
});
注:dedupe は Pages Router では利用できません。
Flags Explorer セットアップ
Next.js (App Router)
// app/.well-known/vercel/flags/route.ts
import { createFlagsDiscoveryEndpoint } from 'flags/next';
import { getProviderData } from '@flags-sdk/vercel';
import * as flags from '../../../../flags';
export const GET = createFlagsDiscoveryEndpoint(async () => {
return getProviderData(flags);
});
外部プロバイダーデータ付き
サードパーティプロバイダーを Vercel Flags と共に使用する場合、mergeProviderData でそれらのデータを組み合わせます。各プロバイダーアダプターは独自の getProviderData をエクスポートします — references/providers.md のプロバイダー固有の例を参照してください。
SvelteKit
// src/hooks.server.ts
import { createHandle } from 'flags/sveltekit';
import { FLAGS_SECRET } from '$env/static/private';
import * as flags from '$lib/flags';
export const handle = createHandle({ secret: FLAGS_SECRET, flags });
FLAGS_SECRET
precompute と Flags Explorer に必須です。32 ランダムバイト、base64 エンコード必須:
node -e "console.log(crypto.randomBytes(32).toString('base64url'))"
各環境 (Development、Preview、Production) に別々の FLAGS_SECRET 値を使用し、Preview と Production の値を Sensitive にマークします。環境ごとに一度ジェネレーターを実行して異なる値を生成し、各値を Vercel に保存します:
vercel env add FLAGS_SECRET production --sensitive --value <production-secret>
vercel env add FLAGS_SECRET preview --sensitive --value <preview-secret>
vercel env add FLAGS_SECRET development --value <development-secret>
その後、vc env pull を実行してローカルに同期してください。
Precompute パターン
precompute を使用してフィーチャーフラグを使用しながらページを静的に保ちます。ミドルウェアはフラグを評価し、リライトを通じて URL に結果をエンコードします。ページは precompute 値を読み取り、再評価しません。
高レベルのフロー:
- フラグを宣言して配列にグループ化
- ミドルウェアで
precompute(flagGroup)を呼び出し、code文字列を取得 - リクエストを
/${code}/original-pathにリライト - ページはコードからフラグ値を読み取ります:
await myFlag(code, flagGroup)
完全な実装の詳細については、フレームワーク固有のリファレンスを参照してください:
- Next.js:
references/nextjs.mdを参照 — プロキシミドルウェア、precompute セットアップ、ISR、generatePermutations、複数グループをカバー - SvelteKit:
references/sveltekit.mdを参照 — reroute フック、ミドルウェア、precompute セットアップ、ISR、プリレンダリングをカバー
カスタムアダプター
origin と decide を返すアダプターファクトリーを作成します。完全なパターン (デフォルトアダプターとシングルトンクライアントの例を含む) については、references/providers.md を参照してください。
暗号化関数
ブラウザでフラグデータを機密にしておくため (Flags Explorer で使用):
| 関数 | 目的 |
|---|---|
encryptFlagValues | 解決されたフラグ値を暗号化 |
decryptFlagValues | フラグ値を復号化 |
encryptFlagDefinitions | フラグ定義/メタデータを暗号化 |
decryptFlagDefinitions | フラグ定義を復号化 |
encryptOverrides | ツールバーオーバーライドを暗号化 |
decryptOverrides | ツールバーオーバーライドを復号化 |
すべてデフォルトで FLAGS_SECRET を使用します。例:
import { encryptFlagValues } from 'flags';
import { FlagValues } from 'flags/react';
async function ConfidentialFlags({ values }) {
const encrypted = await encryptFlagValues(values);
return <FlagValues values={encrypted} />;
}
React コンポーネント
import { FlagValues, FlagDefinitions } from 'flags/react';
// Flags Explorer 用のフラグ値でスクリプトタグをレンダリング
<FlagValues values={{ myFlag: true }} />
// Flags Explorer 用のフラグ定義でスクリプトタグをレンダリング
<FlagDefinitions definitions={{ myFlag: { options: [...], description: '...' } }} />
リファレンス
詳細なフレームワークとプロバイダーガイドは、コンテキストを精簡するために別ファイルに記載されています:
references/nextjs.md:Next.js クイックスタート、ツールバー、App Router、Pages Router、ミドルウェア/プロキシ、precompute、dedupe、ダッシュボードページ、マーケティングページ、suspense フォールバックreferences/sveltekit.md:SvelteKit クイックスタート、ツールバー、フック セットアップ、reroute + ミドルウェア付き precompute、ダッシュボードページ、マーケティングページreferences/providers.md:すべてのプロバイダーアダプター — Vercel、Edge Config、Statsig、LaunchDarkly、PostHog、GrowthBook、Hypertune、Flagsmith、Reflag、Split、Optimizely、OpenFeature、カスタムアダプターreferences/api.md:flags、flags/react、flags/next、flags/sveltekitの完全な API リファレンス
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- vercel
- リポジトリ
- vercel/flags
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/vercel/flags / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。