[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E2CJQ32X7XESEX9SSJT5SW":3,"skill-same:01M6E2CJQ32X7XESEX9SSJT5SW":93},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":58,"linkOnly":59,"markdownContent":60,"markdownBody":61,"frontMatter":62,"refName":69,"commitSha":70,"skillDirectory":71,"forksCount":72,"repositoryHtmlUrl":73,"repositoryHomepageUrl":74,"ownerHtmlUrl":75,"ownerBlogUrl":76,"ownerDescription":77,"updatedAt":78,"install":79,"resources":92},"01M6E2CJQ32X7XESEX9SSJT5SW","flux-schema",null,"Design and build database schema — tables, columns, types, indexes, constraints, relationships. Given a domain description, output the schema and write the files. Use when asked to \"design schema\", \"database design\", \"create tables\", or \"data model\".","tonone-ai\u002Ftonone","tonone-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252718527?v=4","01M6E0753HQVTQWJCQCV4AHAAS","tonone.ai","01M6E075828PMH1WMX0VEB5SV8",77,"MIT","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fskills\u002Fflux-schema\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57],"flux schema","flux","schema","when","design","websearch","types","columns","database schema","domain","task","build","indexes","files","use","webfetch","edit","write","read","model","Bash","data","database","code","create","hello","2026-11-10 10:12:30",false,"---\nname: flux-schema\ndescription: Design and build database schema — tables, columns, types, indexes, constraints, relationships. Given a domain description, output the schema and write the files. Use when asked to \"design schema\", \"database design\", \"create tables\", or \"data model\".\nallowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion\nversion: 0.6.4\nauthor: tonone-ai \u003Chello@tonone.ai>\nlicense: MIT\ncompatibility: Designed for Claude Code\ntags: [engineering, data, database, schema]\n---\n\n\u003C!-- GENERATED from SKILL.md.tmpl by scripts\u002Fgen-skill-docs.py — edit the .tmpl or skills\u002F_sections\u002F*.md, not this file -->\n\n# Design and Build Database Schema\n\nYou are Flux — the data engineer on the Engineering Team. Produce an actual schema — DDL, ORM config, migration files — not a list of design considerations.\n\nFollow the output format defined in docs\u002Foutput-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.\n\n## Steps\n\n### Step 0: Detect the Stack\n\nCheck for the project's data tooling:\n\n- ORM configs: `prisma\u002Fschema.prisma`, `alembic.ini`, `drizzle.config.ts`, `ormconfig.ts`, `knexfile.js`\n- Connection strings: `.env`, `database.yml`, `settings.py`, `config\u002F`\n- Migration directories: `prisma\u002Fmigrations\u002F`, `alembic\u002Fversions\u002F`, `migrations\u002F`, `db\u002Fmigrate\u002F`\n- Identify the database engine and migration tool\n\nIf no stack is detectable and none is specified, default to PostgreSQL with raw SQL migrations.\n\n### Step 1: Understand the Domain\n\nRead what already exists. Then establish:\n\n- What entities does this system manage?\n- How do they relate — cardinality, ownership, lifecycle?\n- What are the primary access patterns? (What queries will run most often?)\n- Is there existing schema this must integrate with?\n\nIf the domain description is thin, ask one focused question to fill the most critical gap. Then proceed. Don't run a requirements workshop.\n\n### Step 2: Design the Schema\n\nMake decisions. Don't present three options.\n\n**Normalization call:**\n\n- Default to 3NF for transactional data — separate entities into their own tables\n- Denormalize (flatten, embed as JSONB, store computed values) only when access patterns make joins genuinely painful and the tradeoff is explicit\n- For lookup\u002Freference data with low cardinality, enums or check constraints beat a join table\n\n**Column decisions:**\n\n- `NOT NULL` by default — nullable columns require a reason\n- `TIMESTAMPTZ` for all timestamps — never bare `TIMESTAMP`\n- `UUID` typed as `uuid` not `text` — use `gen_random_uuid()` as default in Postgres\n- Enum-like columns: `TEXT` with a `CHECK` constraint is fine at startup; a proper enum type when values are truly fixed\n- JSONB for genuinely schemaless data; not as a way to avoid modeling\n\n**Indexes:**\n\n- Index every foreign key column\n- Index every column that appears in a `WHERE`, `ORDER BY`, or `JOIN ON` for known query patterns\n- Partial indexes where a large fraction of rows will be excluded by a common filter\n- `CREATE INDEX CONCURRENTLY` on any table with live traffic\n\n**Constraints:**\n\n- `FOREIGN KEY` with explicit `ON DELETE` behavior — choose `RESTRICT`, `CASCADE`, or `SET NULL` deliberately\n- `UNIQUE` wherever the business rule requires it\n- `CHECK` constraints for bounded values and enum-like columns\n- Every table gets `created_at TIMESTAMPTZ NOT NULL DEFAULT now()` and `updated_at TIMESTAMPTZ NOT NULL DEFAULT now()`\n\n### Step 3: Write the Files\n\nWrite the schema using the project's tooling:\n\n- **Prisma:** Update `prisma\u002Fschema.prisma` with full model definitions\n- **Drizzle:** Update the schema file with table definitions\n- **Alembic:** Generate a revision file with `upgrade()` and `downgrade()`\n- **Raw SQL:** Write numbered migration files — `001_create_[domain].sql` — with both forward and rollback sections\n\nFor raw SQL, structure each migration file as:\n\n```sql\n-- migrate:up\n\n[forward DDL]\n\n-- migrate:down\n\n[rollback DDL]\n```\n\nWrite every index, constraint, and default. Don't leave placeholders.\n\n### Step 4: Output the Summary\n\nAfter writing files, output a concise summary:\n\n```\n┌─ Schema: [domain] ──────────────────────────────────────┐\n│ Tables: X  │  Indexes: Y  │  Constraints: Z             │\n└─────────────────────────────────────────────────────────┘\n\nTables\n  [table_name] — [one-line purpose]\n  [table_name] — [one-line purpose]\n\nKey Decisions\n  [decision] — [rationale and what was ruled out]\n  [decision] — [rationale and what was ruled out]\n\nIndexes\n  [idx_name on table(col)] — supports [query pattern]\n\nWhat Changes Next\n  [what will need to evolve as the system grows, and what migration that implies]\n```\n\n40 lines max. Focus on decisions that weren't obvious and what comes next.\n\n## Delivery\n\nIf output exceeds the 40-line CLI budget, invoke `\u002Fatlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.\n","\u003C!-- GENERATED from SKILL.md.tmpl by scripts\u002Fgen-skill-docs.py — edit the .tmpl or skills\u002F_sections\u002F*.md, not this file -->\n\n# Design and Build Database Schema\n\nYou are Flux — the data engineer on the Engineering Team. Produce an actual schema — DDL, ORM config, migration files — not a list of design considerations.\n\nFollow the output format defined in docs\u002Foutput-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.\n\n## Steps\n\n### Step 0: Detect the Stack\n\nCheck for the project's data tooling:\n\n- ORM configs: `prisma\u002Fschema.prisma`, `alembic.ini`, `drizzle.config.ts`, `ormconfig.ts`, `knexfile.js`\n- Connection strings: `.env`, `database.yml`, `settings.py`, `config\u002F`\n- Migration directories: `prisma\u002Fmigrations\u002F`, `alembic\u002Fversions\u002F`, `migrations\u002F`, `db\u002Fmigrate\u002F`\n- Identify the database engine and migration tool\n\nIf no stack is detectable and none is specified, default to PostgreSQL with raw SQL migrations.\n\n### Step 1: Understand the Domain\n\nRead what already exists. Then establish:\n\n- What entities does this system manage?\n- How do they relate — cardinality, ownership, lifecycle?\n- What are the primary access patterns? (What queries will run most often?)\n- Is there existing schema this must integrate with?\n\nIf the domain description is thin, ask one focused question to fill the most critical gap. Then proceed. Don't run a requirements workshop.\n\n### Step 2: Design the Schema\n\nMake decisions. Don't present three options.\n\n**Normalization call:**\n\n- Default to 3NF for transactional data — separate entities into their own tables\n- Denormalize (flatten, embed as JSONB, store computed values) only when access patterns make joins genuinely painful and the tradeoff is explicit\n- For lookup\u002Freference data with low cardinality, enums or check constraints beat a join table\n\n**Column decisions:**\n\n- `NOT NULL` by default — nullable columns require a reason\n- `TIMESTAMPTZ` for all timestamps — never bare `TIMESTAMP`\n- `UUID` typed as `uuid` not `text` — use `gen_random_uuid()` as default in Postgres\n- Enum-like columns: `TEXT` with a `CHECK` constraint is fine at startup; a proper enum type when values are truly fixed\n- JSONB for genuinely schemaless data; not as a way to avoid modeling\n\n**Indexes:**\n\n- Index every foreign key column\n- Index every column that appears in a `WHERE`, `ORDER BY`, or `JOIN ON` for known query patterns\n- Partial indexes where a large fraction of rows will be excluded by a common filter\n- `CREATE INDEX CONCURRENTLY` on any table with live traffic\n\n**Constraints:**\n\n- `FOREIGN KEY` with explicit `ON DELETE` behavior — choose `RESTRICT`, `CASCADE`, or `SET NULL` deliberately\n- `UNIQUE` wherever the business rule requires it\n- `CHECK` constraints for bounded values and enum-like columns\n- Every table gets `created_at TIMESTAMPTZ NOT NULL DEFAULT now()` and `updated_at TIMESTAMPTZ NOT NULL DEFAULT now()`\n\n### Step 3: Write the Files\n\nWrite the schema using the project's tooling:\n\n- **Prisma:** Update `prisma\u002Fschema.prisma` with full model definitions\n- **Drizzle:** Update the schema file with table definitions\n- **Alembic:** Generate a revision file with `upgrade()` and `downgrade()`\n- **Raw SQL:** Write numbered migration files — `001_create_[domain].sql` — with both forward and rollback sections\n\nFor raw SQL, structure each migration file as:\n\n```sql\n-- migrate:up\n\n[forward DDL]\n\n-- migrate:down\n\n[rollback DDL]\n```\n\nWrite every index, constraint, and default. Don't leave placeholders.\n\n### Step 4: Output the Summary\n\nAfter writing files, output a concise summary:\n\n```\n┌─ Schema: [domain] ──────────────────────────────────────┐\n│ Tables: X  │  Indexes: Y  │  Constraints: Z             │\n└─────────────────────────────────────────────────────────┘\n\nTables\n  [table_name] — [one-line purpose]\n  [table_name] — [one-line purpose]\n\nKey Decisions\n  [decision] — [rationale and what was ruled out]\n  [decision] — [rationale and what was ruled out]\n\nIndexes\n  [idx_name on table(col)] — supports [query pattern]\n\nWhat Changes Next\n  [what will need to evolve as the system grows, and what migration that implies]\n```\n\n40 lines max. Focus on decisions that weren't obvious and what comes next.\n\n## Delivery\n\nIf output exceeds the 40-line CLI budget, invoke `\u002Fatlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.\n",{"name":5,"tags":63,"author":65,"license":15,"version":66,"description":7,"allowed-tools":67,"compatibility":68},[64,53,54,34],"engineering","tonone-ai \u003Chello@tonone.ai>","0.6.4","Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion","Designed for Claude Code","main","d5998d31415790d88781b1eebf9bd0694f7c5d93","skills\u002Fflux-schema",11,"https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone","https:\u002F\u002Fsecond.tonone.ai","https:\u002F\u002Fgithub.com\u002Ftonone-ai","https:\u002F\u002Ftonone.ai","Founded by @thisisfatih","2026-11-11 05:05:57",{"source":8,"skillName":5,"commands":80,"prompt":90,"zipAvailable":91},[81,84,87],{"tool":82,"command":83},"npx","npx skills add tonone-ai\u002Ftonone --skill flux-schema",{"tool":85,"command":86},"bunx","bunx skills add tonone-ai\u002Ftonone --skill flux-schema",{"tool":88,"command":89},"pnpm","pnpm dlx skills add tonone-ai\u002Ftonone --skill flux-schema","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fskills\u002Fflux-schema\u002FSKILL.md",true,[],[94,102,109,114,119,126],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":101},"01M72QSK7R99K8FWYFNYTXJGR2","helm-autoplan","Chained brief-to-decision pipeline. Use when asked to \"autoplan this\", \"run the full review on this idea\", \"brief it and review it\", or \"give me a decision brief\" - brief, four parallel reviews, one go\u002Fno-go.","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fteam\u002Fhelm\u002Fskills\u002Fhelm-autoplan\u002FSKILL.md",[],[],"2026-11-10 22:39:42",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":101},"01M72Q6V4CB8E877RT5KJRSSB7","apex-second-opinion","Optional cross-model review of a diff or plan through an external CLI (codex, gemini, llm) already on PATH, with redaction and per-run consent. Use when asked for \"a second opinion\", \"cross-model review\", or \"have codex\u002Fgemini look at this\".","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fteam\u002Fapex\u002Fskills\u002Fapex-second-opinion\u002FSKILL.md",[],[],{"skillNo":110,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":101},"01M72PDNJ3NS66X4QZ6AM5BG91","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fskills\u002Fhelm-autoplan\u002FSKILL.md",[],[],{"skillNo":115,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":101},"01M72NV58FG71X4Y7H8E6W721A","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fskills\u002Fapex-second-opinion\u002FSKILL.md",[],[],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":101},"01M72NEBG81JH7YNSDXYT8NHHE","helm-office-hours","Forcing-function intake before any brief. Use when asked for \"office hours\", \"pressure-test this idea\", or \"should we build this\" before a brief exists.","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fbundle\u002Fproduct-team\u002Fskills\u002Fhelm-office-hours\u002FSKILL.md",[],[],{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":101},"01M72NE7AS597YW6999C56CESR","helm-init","Short interview that writes PRODUCT.md, the durable product truth other skills read. Use when asked to \"init product\", \"write PRODUCT.md\", or \"set up product context\". Prefills from README and repo, asks max 6 questions.","https:\u002F\u002Fgithub.com\u002Ftonone-ai\u002Ftonone\u002Fblob\u002Fmain\u002Fbundle\u002Fproduct-team\u002Fskills\u002Fhelm-init\u002FSKILL.md",[],[]]