[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G1KSRMXMYBWTPQ7DVRTGP9":3,"skill-same:01M6G1KSRMXMYBWTPQ7DVRTGP9":55},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":30,"frontMatter":31,"refName":32,"commitSha":33,"skillDirectory":34,"forksCount":35,"repositoryHtmlUrl":36,"repositoryHomepageUrl":6,"ownerHtmlUrl":37,"ownerBlogUrl":38,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M6G1KSRMXMYBWTPQ7DVRTGP9","database-schema-designer",null,"oabdelmaksoud\u002FAgention","oabdelmaksoud","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F50699149?v=4","01M6D5CVVN778ZCDP1WHS816SP","Omar Abdelmaksoud","01M6D8A4TE76V3DCSH3D94VG1V",2,"MIT","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fclaude-skills\u002Fengineering\u002Fdatabase-schema-designer\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[23,24,25,26,27],"database","database schema designer","designer","schema","database schema","2026-11-10 10:12:30",false,"# Database Schema Designer\n\n**Tier:** POWERFUL  \n**Category:** Engineering  \n**Domain:** Data Architecture \u002F Backend  \n\n---\n\n## Overview\n\nDesign relational database schemas from requirements and generate migrations, TypeScript\u002FPython types, seed data, RLS policies, and indexes. Handles multi-tenancy, soft deletes, audit trails, versioning, and polymorphic associations.\n\n## Core Capabilities\n\n- **Schema design** — normalize requirements into tables, relationships, constraints\n- **Migration generation** — Drizzle, Prisma, TypeORM, Alembic\n- **Type generation** — TypeScript interfaces, Python dataclasses\u002FPydantic models\n- **RLS policies** — Row-Level Security for multi-tenant apps\n- **Index strategy** — composite indexes, partial indexes, covering indexes\n- **Seed data** — realistic test data generation\n- **ERD generation** — Mermaid diagram from schema\n\n---\n\n## When to Use\n\n- Designing a new feature that needs database tables\n- Reviewing a schema for performance or normalization issues\n- Adding multi-tenancy to an existing schema\n- Generating TypeScript types from a Prisma schema\n- Planning a schema migration for a breaking change\n\n---\n\n## Schema Design Process\n\n### Step 1: Requirements → Entities\n\nGiven requirements:\n> \"Users can create projects. Each project has tasks. Tasks can have labels. Tasks can be assigned to users. We need a full audit trail.\"\n\nExtract entities:\n```\nUser, Project, Task, Label, TaskLabel (junction), TaskAssignment, AuditLog\n```\n\n### Step 2: Identify Relationships\n\n```\nUser 1──* Project         (owner)\nProject 1──* Task\nTask *──* Label            (via TaskLabel)\nTask *──* User            (via TaskAssignment)\nUser 1──* AuditLog\n```\n\n### Step 3: Add Cross-cutting Concerns\n\n- Multi-tenancy: add `organization_id` to all tenant-scoped tables\n- Soft deletes: add `deleted_at TIMESTAMPTZ` instead of hard deletes\n- Audit trail: add `created_by`, `updated_by`, `created_at`, `updated_at`\n- Versioning: add `version INTEGER` for optimistic locking\n\n---\n\n## Full Schema Example (Task Management SaaS)\n\n### Prisma Schema\n\n```prisma\n\u002F\u002F schema.prisma\ngenerator client {\n  provider = \"prisma-client-js\"\n}\n\ndatasource db {\n  provider = \"postgresql\"\n  url      = env(\"DATABASE_URL\")\n}\n\n\u002F\u002F ── Multi-tenancy ─────────────────────────────────────────────────────────────\n\nmodel Organization {\n  id        String   @id @default(cuid())\n  name      String\n  slug      String   @unique\n  plan      Plan     @default(FREE)\n  createdAt DateTime @default(now()) @map(\"created_at\")\n  updatedAt DateTime @updatedAt @map(\"updated_at\")\n  deletedAt DateTime? @map(\"deleted_at\")\n\n  users      OrganizationMember[]\n  projects   Project[]\n  auditLogs  AuditLog[]\n\n  @@map(\"organizations\")\n}\n\nmodel OrganizationMember {\n  id             String   @id @default(cuid())\n  organizationId String   @map(\"organization_id\")\n  userId         String   @map(\"user_id\")\n  role           OrgRole  @default(MEMBER)\n  joinedAt       DateTime @default(now()) @map(\"joined_at\")\n\n  organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)\n  user         User         @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n  @@unique([organizationId, userId])\n  @@index([userId])\n  @@map(\"organization_members\")\n}\n\nmodel User {\n  id           String    @id @default(cuid())\n  email        String    @unique\n  name         String?\n  avatarUrl    String?   @map(\"avatar_url\")\n  passwordHash String?   @map(\"password_hash\")\n  emailVerifiedAt DateTime? @map(\"email_verified_at\")\n  lastLoginAt  DateTime? @map(\"last_login_at\")\n  createdAt    DateTime  @default(now()) @map(\"created_at\")\n  updatedAt    DateTime  @updatedAt @map(\"updated_at\")\n  deletedAt    DateTime? @map(\"deleted_at\")\n\n  memberships  OrganizationMember[]\n  ownedProjects Project[]           @relation(\"ProjectOwner\")\n  assignedTasks TaskAssignment[]\n  comments     Comment[]\n  auditLogs    AuditLog[]\n\n  @@map(\"users\")\n}\n\n\u002F\u002F ── Core entities ─────────────────────────────────────────────────────────────\n\nmodel Project {\n  id             String   @id @default(cuid())\n  organizationId String   @map(\"organization_id\")\n  ownerId        String   @map(\"owner_id\")\n  name           String\n  description    String?\n  status         ProjectStatus @default(ACTIVE)\n  settings       Json     @default(\"{}\")\n  createdAt      DateTime @default(now()) @map(\"created_at\")\n  updatedAt      DateTime @updatedAt @map(\"updated_at\")\n  deletedAt      DateTime? @map(\"deleted_at\")\n\n  organization Organization @relation(fields: [organizationId], references: [id])\n  owner        User         @relation(\"ProjectOwner\", fields: [ownerId], references: [id])\n  tasks        Task[]\n  labels       Label[]\n\n  @@index([organizationId])\n  @@index([organizationId, status])\n  @@index([deletedAt])\n  @@map(\"projects\")\n}\n\nmodel Task {\n  id          String     @id @default(cuid())\n  projectId   String     @map(\"project_id\")\n  title       String\n  description String?\n  status      TaskStatus @default(TODO)\n  priority    Priority   @default(MEDIUM)\n  dueDate     DateTime?  @map(\"due_date\")\n  position    Float      @default(0)          \u002F\u002F For drag-and-drop ordering\n  version     Int        @default(1)           \u002F\u002F Optimistic locking\n  createdById String     @map(\"created_by_id\")\n  updatedById String     @map(\"updated_by_id\")\n  createdAt   DateTime   @default(now()) @map(\"created_at\")\n  updatedAt   DateTime   @updatedAt @map(\"updated_at\")\n  deletedAt   DateTime?  @map(\"deleted_at\")\n\n  project     Project          @relation(fields: [projectId], references: [id])\n  assignments TaskAssignment[]\n  labels      TaskLabel[]\n  comments    Comment[]\n  attachments Attachment[]\n\n  @@index([projectId])\n  @@index([projectId, status])\n  @@index([projectId, deletedAt])\n  @@index([dueDate], where: { deletedAt: null })  \u002F\u002F Partial index\n  @@map(\"tasks\")\n}\n\n\u002F\u002F ── Polymorphic attachments ───────────────────────────────────────────────────\n\nmodel Attachment {\n  id           String   @id @default(cuid())\n  \u002F\u002F Polymorphic association\n  entityType   String   @map(\"entity_type\")   \u002F\u002F \"task\" | \"comment\"\n  entityId     String   @map(\"entity_id\")\n  filename     String\n  mimeType     String   @map(\"mime_type\")\n  sizeBytes    Int      @map(\"size_bytes\")\n  storageKey   String   @map(\"storage_key\")   \u002F\u002F S3 key\n  uploadedById String   @map(\"uploaded_by_id\")\n  createdAt    DateTime @default(now()) @map(\"created_at\")\n\n  \u002F\u002F Only one concrete relation (task) — polymorphic handled at app level\n  task      Task? @relation(fields: [entityId], references: [id], map: \"attachment_task_fk\")\n\n  @@index([entityType, entityId])\n  @@map(\"attachments\")\n}\n\n\u002F\u002F ── Audit trail ───────────────────────────────────────────────────────────────\n\nmodel AuditLog {\n  id             String   @id @default(cuid())\n  organizationId String   @map(\"organization_id\")\n  userId         String?  @map(\"user_id\")\n  action         String                           \u002F\u002F \"task.created\", \"task.status_changed\"\n  entityType     String   @map(\"entity_type\")\n  entityId       String   @map(\"entity_id\")\n  before         Json?                            \u002F\u002F Previous state\n  after          Json?                            \u002F\u002F New state\n  ipAddress      String?  @map(\"ip_address\")\n  userAgent      String?  @map(\"user_agent\")\n  createdAt      DateTime @default(now()) @map(\"created_at\")\n\n  organization Organization @relation(fields: [organizationId], references: [id])\n  user         User?        @relation(fields: [userId], references: [id])\n\n  @@index([organizationId, createdAt(sort: Desc)])\n  @@index([entityType, entityId])\n  @@index([userId])\n  @@map(\"audit_logs\")\n}\n\nenum Plan        { FREE STARTER GROWTH ENTERPRISE }\nenum OrgRole     { OWNER ADMIN MEMBER VIEWER }\nenum ProjectStatus { ACTIVE ARCHIVED }\nenum TaskStatus  { TODO IN_PROGRESS IN_REVIEW DONE CANCELLED }\nenum Priority    { LOW MEDIUM HIGH CRITICAL }\n```\n\n---\n\n### Drizzle Schema (TypeScript)\n\n```typescript\n\u002F\u002F db\u002Fschema.ts\nimport {\n  pgTable, text, timestamp, integer, boolean,\n  varchar, jsonb, real, pgEnum, uniqueIndex, index,\n} from 'drizzle-orm\u002Fpg-core'\nimport { createId } from '@paralleldrive\u002Fcuid2'\n\nexport const taskStatusEnum = pgEnum('task_status', [\n  'todo', 'in_progress', 'in_review', 'done', 'cancelled'\n])\nexport const priorityEnum = pgEnum('priority', ['low', 'medium', 'high', 'critical'])\n\nexport const tasks = pgTable('tasks', {\n  id:          text('id').primaryKey().$defaultFn(() => createId()),\n  projectId:   text('project_id').notNull().references(() => projects.id),\n  title:       varchar('title', { length: 500 }).notNull(),\n  description: text('description'),\n  status:      taskStatusEnum('status').notNull().default('todo'),\n  priority:    priorityEnum('priority').notNull().default('medium'),\n  dueDate:     timestamp('due_date', { withTimezone: true }),\n  position:    real('position').notNull().default(0),\n  version:     integer('version').notNull().default(1),\n  createdById: text('created_by_id').notNull().references(() => users.id),\n  updatedById: text('updated_by_id').notNull().references(() => users.id),\n  createdAt:   timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n  updatedAt:   timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n  deletedAt:   timestamp('deleted_at', { withTimezone: true }),\n}, (table) => ({\n  projectIdx:       index('tasks_project_id_idx').on(table.projectId),\n  projectStatusIdx: index('tasks_project_status_idx').on(table.projectId, table.status),\n}))\n\n\u002F\u002F Infer TypeScript types\nexport type Task = typeof tasks.$inferSelect\nexport type NewTask = typeof tasks.$inferInsert\n```\n\n---\n\n### Alembic Migration (Python \u002F SQLAlchemy)\n\n```python\n# alembic\u002Fversions\u002F20260301_create_tasks.py\n\"\"\"Create tasks table\n\nRevision ID: a1b2c3d4e5f6\nRevises: previous_revision\nCreate Date: 2026-03-01 12:00:00\n\"\"\"\n\nfrom alembic import op\nimport sqlalchemy as sa\nfrom sqlalchemy.dialects import postgresql\n\nrevision = 'a1b2c3d4e5f6'\ndown_revision = 'previous_revision'\n\n\ndef upgrade() -> None:\n    # Create enums\n    task_status = postgresql.ENUM(\n        'todo', 'in_progress', 'in_review', 'done', 'cancelled',\n        name='task_status'\n    )\n    task_status.create(op.get_bind())\n    \n    op.create_table(\n        'tasks',\n        sa.Column('id', sa.Text(), primary_key=True),\n        sa.Column('project_id', sa.Text(), sa.ForeignKey('projects.id'), nullable=False),\n        sa.Column('title', sa.VARCHAR(500), nullable=False),\n        sa.Column('description', sa.Text()),\n        sa.Column('status', postgresql.ENUM('todo', 'in_progress', 'in_review', 'done', 'cancelled', name='task_status', create_type=False), nullable=False, server_default='todo'),\n        sa.Column('priority', sa.Text(), nullable=False, server_default='medium'),\n        sa.Column('due_date', sa.TIMESTAMP(timezone=True)),\n        sa.Column('position', sa.Float(), nullable=False, server_default='0'),\n        sa.Column('version', sa.Integer(), nullable=False, server_default='1'),\n        sa.Column('created_by_id', sa.Text(), sa.ForeignKey('users.id'), nullable=False),\n        sa.Column('updated_by_id', sa.Text(), sa.ForeignKey('users.id'), nullable=False),\n        sa.Column('created_at', sa.TIMESTAMP(timezone=True), nullable=False, server_default=sa.text('NOW()')),\n        sa.Column('updated_at', sa.TIMESTAMP(timezone=True), nullable=False, server_default=sa.text('NOW()')),\n        sa.Column('deleted_at', sa.TIMESTAMP(timezone=True)),\n    )\n    \n    # Indexes\n    op.create_index('tasks_project_id_idx', 'tasks', ['project_id'])\n    op.create_index('tasks_project_status_idx', 'tasks', ['project_id', 'status'])\n    # Partial index for active tasks only\n    op.create_index(\n        'tasks_due_date_active_idx',\n        'tasks', ['due_date'],\n        postgresql_where=sa.text('deleted_at IS NULL')\n    )\n\n\ndef downgrade() -> None:\n    op.drop_table('tasks')\n    op.execute(\"DROP TYPE IF EXISTS task_status\")\n```\n\n---\n\n## Row-Level Security (RLS) Policies\n\n```sql\n-- Enable RLS\nALTER TABLE tasks ENABLE ROW LEVEL SECURITY;\nALTER TABLE projects ENABLE ROW LEVEL SECURITY;\n\n-- Create app role\nCREATE ROLE app_user;\n\n-- Users can only see tasks in their organization's projects\nCREATE POLICY tasks_org_isolation ON tasks\n  FOR ALL TO app_user\n  USING (\n    project_id IN (\n      SELECT p.id FROM projects p\n      JOIN organization_members om ON om.organization_id = p.organization_id\n      WHERE om.user_id = current_setting('app.current_user_id')::text\n    )\n  );\n\n-- Soft delete: never show deleted records\nCREATE POLICY tasks_no_deleted ON tasks\n  FOR SELECT TO app_user\n  USING (deleted_at IS NULL);\n\n-- Only task creator or admin can delete\nCREATE POLICY tasks_delete_policy ON tasks\n  FOR DELETE TO app_user\n  USING (\n    created_by_id = current_setting('app.current_user_id')::text\n    OR EXISTS (\n      SELECT 1 FROM organization_members om\n      JOIN projects p ON p.organization_id = om.organization_id\n      WHERE p.id = tasks.project_id\n        AND om.user_id = current_setting('app.current_user_id')::text\n        AND om.role IN ('owner', 'admin')\n    )\n  );\n\n-- Set user context (call at start of each request)\nSELECT set_config('app.current_user_id', $1, true);\n```\n\n---\n\n## Seed Data Generation\n\n```typescript\n\u002F\u002F db\u002Fseed.ts\nimport { faker } from '@faker-js\u002Ffaker'\nimport { db } from '.\u002Fclient'\nimport { organizations, users, projects, tasks } from '.\u002Fschema'\nimport { createId } from '@paralleldrive\u002Fcuid2'\nimport { hashPassword } from '..\u002Fsrc\u002Flib\u002Fauth'\n\nasync function seed() {\n  console.log('Seeding database...')\n\n  \u002F\u002F Create org\n  const [org] = await db.insert(organizations).values({\n    id: createId(),\n    name: 'Acme Corp',\n    slug: 'acme',\n    plan: 'growth',\n  }).returning()\n\n  \u002F\u002F Create users\n  const adminUser = await db.insert(users).values({\n    id: createId(),\n    email: 'admin@acme.com',\n    name: 'Alice Admin',\n    passwordHash: await hashPassword('password123'),\n  }).returning().then(r => r[0])\n\n  \u002F\u002F Create projects\n  const projectsData = Array.from({ length: 3 }, () => ({\n    id: createId(),\n    organizationId: org.id,\n    ownerId: adminUser.id,\n    name: faker.company.catchPhrase(),\n    description: faker.lorem.paragraph(),\n    status: 'active' as const,\n  }))\n\n  const createdProjects = await db.insert(projects).values(projectsData).returning()\n\n  \u002F\u002F Create tasks for each project\n  for (const project of createdProjects) {\n    const tasksData = Array.from({ length: faker.number.int({ min: 5, max: 20 }) }, (_, i) => ({\n      id: createId(),\n      projectId: project.id,\n      title: faker.hacker.phrase(),\n      description: faker.lorem.sentences(2),\n      status: faker.helpers.arrayElement(['todo', 'in_progress', 'done'] as const),\n      priority: faker.helpers.arrayElement(['low', 'medium', 'high'] as const),\n      position: i * 1000,\n      createdById: adminUser.id,\n      updatedById: adminUser.id,\n    }))\n\n    await db.insert(tasks).values(tasksData)\n  }\n\n  console.log(`✅ Seeded: 1 org, ${projectsData.length} projects, tasks`)\n}\n\nseed().catch(console.error).finally(() => process.exit(0))\n```\n\n---\n\n## ERD Generation (Mermaid)\n\n```\nerDiagram\n    Organization ||--o{ OrganizationMember : has\n    Organization ||--o{ Project : owns\n    User ||--o{ OrganizationMember : joins\n    User ||--o{ Task : \"created by\"\n    Project ||--o{ Task : contains\n    Task ||--o{ TaskAssignment : has\n    Task ||--o{ TaskLabel : has\n    Task ||--o{ Comment : has\n    Task ||--o{ Attachment : has\n    Label ||--o{ TaskLabel : \"applied to\"\n    User ||--o{ TaskAssignment : assigned\n\n    Organization {\n        string id PK\n        string name\n        string slug\n        string plan\n    }\n\n    Task {\n        string id PK\n        string project_id FK\n        string title\n        string status\n        string priority\n        timestamp due_date\n        timestamp deleted_at\n        int version\n    }\n```\n\nGenerate from Prisma:\n```bash\nnpx prisma-erd-generator\n# or: npx @dbml\u002Fcli prisma2dbml -i schema.prisma | npx dbml-to-mermaid\n```\n\n---\n\n## Common Pitfalls\n\n- **Soft delete without index** — `WHERE deleted_at IS NULL` without index = full scan\n- **Missing composite indexes** — `WHERE org_id = ? AND status = ?` needs a composite index\n- **Mutable surrogate keys** — never use email or slug as PK; use UUID\u002FCUID\n- **Non-nullable without default** — adding a NOT NULL column to existing table requires default or migration plan\n- **No optimistic locking** — concurrent updates overwrite each other; add `version` column\n- **RLS not tested** — always test RLS with a non-superuser role\n\n---\n\n## Best Practices\n\n1. **Timestamps everywhere** — `created_at`, `updated_at` on every table\n2. **Soft deletes for auditable data** — `deleted_at` instead of DELETE\n3. **Audit log for compliance** — log before\u002Fafter JSON for regulated domains\n4. **UUIDs or CUIDs as PKs** — avoid sequential integer leakage\n5. **Index foreign keys** — every FK column should have an index\n6. **Partial indexes** — use `WHERE deleted_at IS NULL` for active-only queries\n7. **RLS over application-level filtering** — database enforces tenancy, not just app code\n",{},"main","a318f48de3c5718e8ea2e9f6fae7790e8a759e85","upstream-sync\u002Fwork\u002Fclaude-skills\u002Fengineering\u002Fdatabase-schema-designer",0,"https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fo-abdelmaksoud\u002F","Full-Stack Engineer | AI Systems Architect | Building autonomous multi-agent systems","2026-03-08 21:23:03",{"source":7,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add oabdelmaksoud\u002FAgention --skill database-schema-designer",{"tool":47,"command":48},"bunx","bunx skills add oabdelmaksoud\u002FAgention --skill database-schema-designer",{"tool":50,"command":51},"pnpm","pnpm dlx skills add oabdelmaksoud\u002FAgention --skill database-schema-designer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fclaude-skills\u002Fengineering\u002Fdatabase-schema-designer\u002FSKILL.md",true,[],[56,78,92,125,151,171],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":65,"publishedAt":28},"01M6G2QFCBNBYAJF2KTK85G9A6","visa-doc-translate","Translate visa application documents (images) to English and create a bilingual PDF with original and translation","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fvisa-doc-translate\u002FSKILL.md",[62],{"categoryNo":63,"categoryName":64,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理",[66,67,68,69,70,71,72,73,74,75,76,77],"translate","doc","visa doc translate","bilingual","with","english","application","PDF","translation","documents","create","images",{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":28},"01M6G2QB09TSK6BY4ME5X20EVQ","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[85,86,87,88,89,90,91],"verification","loop","verification loop","sessions","code","claude code sessions","system",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":109,"publishedAt":28},"01M6G2Q6V2F7G03VAAF27FXPJR","tdd-workflow","Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Ftdd-workflow\u002FSKILL.md",[98,101,104],{"categoryNo":99,"categoryName":100,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[110,111,112,113,114,115,116,117,118,89,119,120,121,122,70,123,124],"workflow","tdd","tdd workflow","use","unit","coverage","refactoring","e2e","integration","development","e2e tests","tests","driven","test","writing",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":28},"01M6G2Q359YJRWAR2PFCEQAXF3","swiftui-patterns","SwiftUI architecture patterns, state management with @Observable, view composition, navigation, performance optimization, and modern iOS\u002FmacOS UI best practices.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswiftui-patterns\u002FSKILL.md",[],[132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,70],"patterns","swiftui","swiftui patterns","architecture","macos","performance","state management","best practices","state","ui","Optimization","ios","architecture patterns","Composition","performance optimization","view","management","swiftui architecture","navigation",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":158,"publishedAt":28},"01M6G2PY8B2FWZTWPZ84H83Y7C","swift-protocol-di-testing","Protocol-based dependency injection for testable Swift code — mock file system, network, and external APIs using focused protocols and Swift Testing.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-protocol-di-testing\u002FSKILL.md",[157],{"categoryNo":99,"categoryName":100,"taxonomyType":20,"taxonomyTypeDesc":21},[159,160,161,162,89,163,164,165,166,91,167,168,169,170],"swift protocol di testing","protocol","swift","testing","protocols","file","network","injection","dependency","swift testing","dependency injection","mock",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":28},"01M6G2PSCN2GXV9FFZDRRRWVB6","swift-concurrency-6-2","Swift 6.2 Approachable Concurrency — single-threaded by default, @concurrent for explicit background offloading, isolated conformances for main actor types.","https:\u002F\u002Fgithub.com\u002Foabdelmaksoud\u002FAgention\u002Fblob\u002Fmain\u002Fupstream-sync\u002Fwork\u002Fecc\u002Fskills\u002Fswift-concurrency-6-2\u002FSKILL.md",[],[178,179,180,161,181,32,182],"concurrency","swift concurrency","swift concurrency 6 2","default","types"]