accessibility-patterns
WCAG 2.2 AA compliance, ARIA patterns, keyboard navigation, screen reader optimization
KVKK and GDPR compliance patterns - consent management, right to erasure, breach notification, audit logging, cookie consent, and data classification.
Claude Code
$ npx -y skills add vibeeval/vibecosystem --skill kvkk-compliance --agent claude-code
Codex
$ npx skills add vibeeval/vibecosystem --skill kvkk-compliance -a codex -y
Cursor
$ npx skills add vibeeval/vibecosystem --skill kvkk-compliance -a cursor -y
Gemini CLI
$ npx skills add vibeeval/vibecosystem --skill kvkk-compliance -a gemini-cli -y
GitHub Copilot
$ npx skills add vibeeval/vibecosystem --skill kvkk-compliance -a github-copilot -y
OpenCode
$ npx skills add vibeeval/vibecosystem --skill kvkk-compliance -a opencode -y
Windsurf
$ npx skills add vibeeval/vibecosystem --skill kvkk-compliance -a windsurf -y
name: kvkk-compliance description: KVKK and GDPR compliance patterns - consent management, right to erasure, breach notification, audit logging, cookie consent, and data classification.
Practical patterns for Turkish KVKK (Law No. 6698) and EU GDPR data protection compliance.
| Aspect | KVKK (Turkey) | GDPR (EU) | |--------|---------------|-----------| | Authority | KVKK Board (Kisisel Verileri Koruma Kurumu) | National DPAs + EDPB | | Consent | Explicit, no pre-ticked boxes | Freely given, specific, informed | | Breach notification | "As soon as possible" to Board | 72 hours to DPA | | DPO requirement | VERBiS registration | Mandatory for public bodies + large-scale | | Right to erasure | Article 7 - withdrawal + deletion | Article 17 - "Right to be forgotten" | | Data transfer abroad | Board approval or adequate country | Adequacy decision, SCCs, or BCRs | | Fines | Up to ~2M TL per violation | Up to 20M EUR or 4% global turnover | | Legal bases | 5 in Article 5 + explicit consent | 6 in Article 6 + explicit consent |
enum DataCategory {
PERSONAL = 'personal', // name, email, phone
SPECIAL = 'special_category', // health, biometrics, religion
ANONYMOUS = 'anonymous', // cannot identify anyone
PSEUDONYMOUS = 'pseudonymous', // identifiable only with additional data
}
interface DataField {
name: string
category: DataCategory
retentionDays: number
requiresExplicitConsent: boolean
encryptAtRest: boolean
}
const USER_DATA_FIELDS: DataField[] = [
{ name: 'email', category: DataCategory.PERSONAL, retentionDays: 730, requiresExplicitConsent: false, encryptAtRest: false },
{ name: 'healthRecords', category: DataCategory.SPECIAL, retentionDays: 365, requiresExplicitConsent: true, encryptAtRest: true },
{ name: 'analyticsId', category: DataCategory.PSEUDONYMOUS, retentionDays: 365, requiresExplicitConsent: false, encryptAtRest: false },
]// BAD: single "accept all" checkbox - violates both KVKK and GDPR
// <input type="checkbox" /> I accept everything
// GOOD: granular, purpose-specific consent
interface ConsentRecord {
userId: string; purpose: string; granted: boolean
timestamp: Date; ipAddress: string; version: string
}
const CONSENT_PURPOSES = [
{ id: 'essential', label: 'Service operation', required: true },
{ id: 'analytics', label: 'Usage analytics', required: false },
{ id: 'marketing', label: 'Marketing emails', required: false },
{ id: 'third_party', label: 'Third-party sharing', required: false },
] as const
async function recordConsent(userId: string, purposeId: string, granted: boolean, meta: { ip: string; userAgent: string }): Promise<ConsentRecord> {
// Always INSERT, never UPDATE - full audit trail
return db.consentRecords.create({
data: { userId, purpose: purposeId, granted, timestamp: new Date(), ipAddress: meta.ip, version: CURRENT_CONSENT_VERSION },
})
}
async function hasActiveConsent(userId: string, purposeId: string): Promise<boolean> {
const latest = await db.consentRecords.findFirst({
where: { userId, purpose: purposeId },
orderBy: { timestamp: 'desc' },
})
return latest?.granted === true
}const GRACE_PERIOD_DAYS = 30
async function requestAccountDeletion(userId: string): Promise<void> {
await db.users.update({ where: { id: userId }, data: { status: 'deletion_pending', deactivatedAt: new Date() } })
await db.deletionRequests.create({
data: { userId, requestedAt: new Date(), gracePeriodEndsAt: new Date(Date.now() + GRACE_PERIOD_DAYS * 86400000), status: 'pending' },
})
}
// Scheduled job: purge after grace period
async function purgeExpiredAccounts(): Promise<void> {
const expired = await db.deletionRequests.findMany({
where: { status: 'pending', gracePeriodEndsAt: { lte: new Date() } },
})
for (const req of expired) {
await db.$transaction(async (tx) => {
await tx.users.update({
where: { id: req.userId },
data: { email: `deleted-${req.userId}@anon.local`, fullName: 'Deleted User', phone: null, address: null, status: 'deleted' },
})
// Anonymize consent records (retain for legal proof, not delete)
await tx.consentRecords.updateMany({
where: { userId: req.userId },
data: { userId: `deleted-${req.userId}`, ipAddress: 'REDACTED' }
})
await tx.orders.updateMany({ where: { userId: req.userId }, data: { userEmail: null, userName: 'Deleted User' } })
await tx.deletionRequests.update({ where: { id: req.id }, data: { status: 'completed', completedAt: new Date() } })
})
}
}const COOKIE_CATEGORIES = {
necessary: { name: 'Strictly Necessary', required: true },
functional: { name: 'Functional', required: false },
analytics: { name: 'Analytics', required: false },
marketing: { name: 'Marketing', required: false },
} as const
type CookiePrefs = Record<keyof typeof COOKIE_CATEGORIES, boolean>
// BAD: set tracking cookies before consent
// document.cookie = '_ga=GA1.2.123; max-age=63072000'
// GOOD: only after explicit consent per category
function applyCookiePreferences(prefs: CookiePrefs): void {
initSessionCookies() // always allowed
prefs.analytics ? initGoogleAnalytics() : removeAnalyticsCookies()
prefs.marketing ? initMarketingPixels() : removeMarketingCookies()
document.cookie = `cookie_consent=${JSON.stringify(prefs)}; path=/; max-age=${365 * 86400}; SameSite=Lax; Secure`
}const NOTIFICATION_DEADLINE_HOURS = 72
async function reportBreach(breach: { detectedAt: Date; severity: string; affectedCount: number; dataTypes: string[]; description: string }): Promise<void> {
const record = await db.dataBreaches.create({ data: { ...breach, notifiedAuthA focused runtime for Claude Code. A bounded worker for Codex. Catalog (in repo): Default core: vibecosystem packages agents, skills and hooks for software work.
WCAG 2.2 AA compliance, ARIA patterns, keyboard navigation, screen reader optimization
axe-core integration, WCAG 2.2 AA checklist, keyboard navigation testing, screen reader testing, and ARIA pattern validation.
Steam-style achievement system with XP, levels, streaks, and skill trees. Gamifies the development workflow. 25 achievements…
Framework for measuring and tracking agent response quality over time. Detects regressions before they reach production. Use when…
Agent ve skill dosyalarinin yapisal dogrulamasi. Frontmatter kontrol, naming convention, zorunlu bolum kontrolu, tutarlilik…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.