skills-ws
Version:
87 agent skills for AI coding assistants — marketing, growth, web3, dev, design & operations. Built for OpenClaw, Claude Code, Cursor, and Codex.
79 lines (62 loc) • 1.68 kB
Markdown
- Feature Flags
- DIY Feature Flags
- LaunchDarkly Integration
```typescript
type FeatureFlag = {
enabled: boolean;
rolloutPercentage?: number;
allowList?: string[];
};
const FLAGS: Record<string, FeatureFlag> = {
'new-checkout-flow': {
enabled: true,
rolloutPercentage: 25,
},
'admin-analytics-v2': {
enabled: true,
allowList: ['user_123', 'user_456'],
},
'dark-mode': {
enabled: process.env.ENABLE_DARK_MODE === 'true',
},
};
export function isFeatureEnabled(flag: string, userId?: string): boolean {
const f = FLAGS[flag];
if (!f || !f.enabled) return false;
if (f.allowList && userId) {
return f.allowList.includes(userId);
}
if (f.rolloutPercentage !== undefined && userId) {
const hash = simpleHash(userId + flag);
return (hash % 100) < f.rolloutPercentage;
}
return f.enabled;
}
function simpleHash(str: string): number {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = ((hash << 5) - hash) + str.charCodeAt(i);
hash |= 0;
}
return Math.abs(hash);
}
```
```typescript
import * as LaunchDarkly from '@launchdarkly/node-server-sdk';
const client = LaunchDarkly.init(process.env.LAUNCHDARKLY_SDK_KEY!);
await client.waitForInitialization({ timeout: 5 });
async function handler(req: Request) {
const user = {
key: req.userId,
email: req.userEmail,
custom: { plan: req.userPlan, company: req.companyId },
};
const showNewCheckout = await client.variation('new-checkout-flow', user, false);
return showNewCheckout ? renderNewCheckout() : renderOldCheckout();
}
```
---