[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699XYVBC3059C2FCWMZ2JPP":3,"skill-same:01M699XYVBC3059C2FCWMZ2JPP":81},{"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":28,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":44,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M699XYVBC3059C2FCWMZ2JPP","data-modeling",null,"Use when the app needs to store or read data — records, a database, entities, CRUD, lists, \"save\u002Fremember X\", or per-user data with row-level security. This app's data layer is Rayfin's: you declare entities as TypeScript classes with decorators in packages\u002Fdata\u002Fsrc\u002F, register them in the schema, and read\u002Fwrite them through the typed rayfin-client. Covers: defining an @entity, field decorators, registering it, per-entity access with @role, owner-only row-level security, and the client query\u002Fmutation API. Triggers: data, database, model, entity, schema, table, record, CRUD, create, read, update, delete, list, store, save, persist, per-user, row-level security, RLS, access control, ownership.","microsoft\u002Frayfin","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M699VK9NEV8GH0Y5JKT1G8XG",655,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[29,30,31,32],"data modeling","typescript","security","rayfin","2026-11-10 10:12:30",false,"---\nname: data-modeling\ndescription: >\n  Use when the app needs to store or read data — records, a database, entities,\n  CRUD, lists, \"save\u002Fremember X\", or per-user data with row-level security. This\n  app's data layer is Rayfin's: you declare entities as TypeScript classes with\n  decorators in packages\u002Fdata\u002Fsrc\u002F, register them in the schema, and read\u002Fwrite them\n  through the typed rayfin-client. Covers: defining an @entity, field decorators,\n  registering it, per-entity access with @role, owner-only row-level security,\n  and the client query\u002Fmutation API. Triggers: data, database, model, entity,\n  schema, table, record, CRUD, create, read, update, delete, list, store, save,\n  persist, per-user, row-level security, RLS, access control, ownership.\n---\n\n# Data modeling — entities, schema, and row-level security\n\nThis app persists data with **Rayfin data**. You define entities as decorated\nTypeScript classes under `packages\u002Fdata\u002Fsrc\u002F`, register them in\n`packages\u002Fdata\u002Fsrc\u002Findex.ts`, define their isomorphic contracts in\n`packages\u002Fshared\u002Fsrc\u002Findex.ts`, and read\u002Fwrite them with the typed client from\n`packages\u002Ffrontend\u002Fsrc\u002Flib\u002Frayfin-client.ts` (`await getRayfinClient()`).\n\n## Read the docs first — they ship in the packages\n\n**Rayfin's data rules are owned by the installed packages, not by this skill.**\nDecorators, field options, relationships, permissions, the query API and the\nplatform's constraints all move between releases. Read them from disk:\n\n| You need… | Read |\n|---|---|\n| `@entity`, every field decorator, and their options | `node_modules\u002F@microsoft\u002Frayfin-core\u002Fassets\u002Fdocs\u002Fdecorators.md` |\n| Permissions end to end — `@role`, the policy DSL, claims, `include` \u002F `exclude` | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fpermissions.md` |\n| The `@anonymous` \u002F `@authenticated` shorthands | `node_modules\u002F@microsoft\u002Frayfin-core\u002Fassets\u002Fdocs\u002Fpermissions.md` |\n| Entity authoring end to end, relationships, schema registration | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Foverview.md` |\n| Reading and writing with the client | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fgraphql.md` |\n| Paging, cursors, text-field nullability | `node_modules\u002F@microsoft\u002Frayfin-data\u002Fassets\u002Fdocs\u002Findex.md` |\n| **Constraints that will bite you** — text length, FK naming, many-to-many, dialect | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fknown-limitations.md` |\n\nRead `known-limitations.md` **before** you design entities. It is short, and it\nis where the platform tells you what it will not do.\n\nEverything below is about **this template** — what it turns on, where files go,\nand how its build is wired. For anything about Rayfin itself, use the table.\n\n## Step 1 — turn the data service on\n\nThe base template keeps the `data` service off, because a dashboard over a\nsemantic model does not need a database. Turn it on for an app that needs\npersistence:\n\n```sh\nnpm run pack:add -- data-modeling\n```\n\nThat flips `data.enabled` in `rayfin\u002Frayfin.yml` and plants a starter entity in\n`packages\u002Fdata\u002Fsrc\u002FItem.ts`, registered in `packages\u002Fdata\u002Fsrc\u002Findex.ts`, with its\nisomorphic contract in `packages\u002Fshared\u002Fsrc\u002Findex.ts`.\nRe-applying is safe: it keeps files you have edited, and `--force-seeds` is the\nexplicit way back to the pack's version.\n\nThe template authenticates before rendering app content through its dynamic auth provider and gate.\nKeep that boundary intact and follow the installed `rayfin-guide\u002Fassets\u002Fdocs\u002Fauth\u002F` pages for additional service-specific requirements.\nPreserve server-side entity permissions and row-level security.\nDo not replace an authentication failure with anonymous access or block the entire app because it is outside the Fabric portal.\n\n## Step 2 — write entity files\n\nOne file per entity under `packages\u002Fdata\u002Fsrc\u002F`, for example\n`packages\u002Fdata\u002Fsrc\u002FNote.ts`.\nStart from the seeded `Item.ts` — rename it and change the fields.\nEditing a working entity is more reliable than writing one from nothing.\nWhen the real model replaces the example, remove the unused starter `Item`\nruntime entity, its `packages\u002Fdata\u002Fsrc\u002Findex.ts` registration, and its\n`packages\u002Fshared\u002Fsrc\u002Findex.ts` contract so it does not become user-visible.\n`@microsoft\u002Frayfin-core`, `@microsoft\u002Frayfin-data` and `@microsoft\u002Frayfin-client`\nare already pinned in the base app — nothing to install.\n\nFor the decorator set, field options, relationship syntax, FK naming and the\nmany-to-many rule, read `rayfin-core\u002Fassets\u002Fdocs\u002Fdecorators.md` and\n`rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Foverview.md`, then `known-limitations.md`.\n\n## Step 3 — register entities in this template's schema\n\n`packages\u002Fdata\u002Fsrc\u002Findex.ts` starts with the seeded `Item` registration, while\n`packages\u002Fshared\u002Fsrc\u002Findex.ts` owns its isomorphic record contract and schema\ntype map.\nAdd every entity, including join entities, to both packages:\n\n```ts\n\u002F\u002F packages\u002Fshared\u002Fsrc\u002Findex.ts\nexport interface NoteRecord {\n  id: number;\n  title: string;\n}\n\nexport type UniversalAppSchema = {\n  Note: NoteRecord;\n};\n\n\u002F\u002F packages\u002Fdata\u002Fsrc\u002Findex.ts\nimport { Note } from '.\u002FNote.js';\n\nexport const schema = [Note];\n```\n\n> The client's generic type comes from `UniversalAppSchema` (already referenced by\n> `packages\u002Ffrontend\u002Fsrc\u002Flib\u002Frayfin-client.ts`), so add every entity to both the\n> `schema` array: one registered in the array but missing from the type is\n> reachable at runtime and invisible to the compiler.\n>\n> **Type-check with `tsc -b`, never `tsc --noEmit`.** The workspace packages are\n> referenced TypeScript projects, and the frontend client imports the shared\n> schema type, so\n> a bare `tsc --noEmit` fails with `TS6305` until the referenced project has been\n> built. Run `npm run typecheck` for the real referenced-project check.\n> `npm run build` uses `tsc -b --noCheck` for speed and does not prove the\n> entity types are correct.\n\n## Step 4 — read and write\n\nThe query chain, mutations, `findById`, filtering and paging are documented in\n`rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fgraphql.md` and\n`rayfin-data\u002Fassets\u002Fdocs\u002Findex.md`. Use `await getRayfinClient()` from\n`packages\u002Ffrontend\u002Fsrc\u002Flib\u002Frayfin-client.ts` inside an async query or mutation; that helper is this template's;\nthe API it returns\nis the package's.\n\nFor the interface over your entities — optimistic updates, forms, and the\nloading \u002F empty \u002F error states — read **`crud-ui`**, which ships the kit.\n\n## Step 5 — per-user data\n\n\"Each person sees only their own …\" is a **server-side** `@role` policy, never a\nfilter in the UI. A client-side filter still leaves the rows fetchable.\n\nRead `rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fpermissions.md` for the decorator, the typed\npolicy DSL, the supported claims, logical composition, and field visibility — it\nis the fullest treatment. `rayfin-core\u002Fassets\u002Fdocs\u002Fpermissions.md` adds the\n`@anonymous` \u002F `@authenticated` shorthands, owner-field typing, and owner\nstamping.\nKeep authentication and authorization on the data operations that require them.\n\n## Notes\n\n- **Stable features only.** Use `@authenticated` \u002F `@role('authenticated', …)`.\n  Anonymous data access on Fabric requires a tenant admin switch — see\n  `rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Foverview.md`. If asked for public data, say so\n  and use authenticated access.\n- **Deploying ships the data model.** A schema change migrates on the next\n  deploy.\n  Read `app-deployment` and follow the installed, version-matched CLI guide.\n\n\u003C!--\nMAINTAINERS: this skill owns *this template* — the data service toggle, the\nworkspace schema shape, the tsc -b build note, and the auth pairing. It does not own\nRayfin.\n\nRayfin's own rules are read at runtime from the installed packages' docs\n(`rayfinDocs.dir`, today `assets\u002Fdocs`), so they cannot drift from the version a\ngenerated app actually has. That replaces the previous arrangement, where this\nfile hand-mirrored rules from the CLI's bundled `skill:rayfin` and had to be\ndiffed against it on every CLI bump. Drift under that arrangement had already\nshipped once: bare `@text()` appeared in every example here while the\nauthoritative rule required an explicit `max` on MSSQL.\n-->\n","# Data modeling — entities, schema, and row-level security\n\nThis app persists data with **Rayfin data**. You define entities as decorated\nTypeScript classes under `packages\u002Fdata\u002Fsrc\u002F`, register them in\n`packages\u002Fdata\u002Fsrc\u002Findex.ts`, define their isomorphic contracts in\n`packages\u002Fshared\u002Fsrc\u002Findex.ts`, and read\u002Fwrite them with the typed client from\n`packages\u002Ffrontend\u002Fsrc\u002Flib\u002Frayfin-client.ts` (`await getRayfinClient()`).\n\n## Read the docs first — they ship in the packages\n\n**Rayfin's data rules are owned by the installed packages, not by this skill.**\nDecorators, field options, relationships, permissions, the query API and the\nplatform's constraints all move between releases. Read them from disk:\n\n| You need… | Read |\n|---|---|\n| `@entity`, every field decorator, and their options | `node_modules\u002F@microsoft\u002Frayfin-core\u002Fassets\u002Fdocs\u002Fdecorators.md` |\n| Permissions end to end — `@role`, the policy DSL, claims, `include` \u002F `exclude` | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fpermissions.md` |\n| The `@anonymous` \u002F `@authenticated` shorthands | `node_modules\u002F@microsoft\u002Frayfin-core\u002Fassets\u002Fdocs\u002Fpermissions.md` |\n| Entity authoring end to end, relationships, schema registration | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Foverview.md` |\n| Reading and writing with the client | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fgraphql.md` |\n| Paging, cursors, text-field nullability | `node_modules\u002F@microsoft\u002Frayfin-data\u002Fassets\u002Fdocs\u002Findex.md` |\n| **Constraints that will bite you** — text length, FK naming, many-to-many, dialect | `node_modules\u002F@microsoft\u002Frayfin-guide\u002Fassets\u002Fdocs\u002Fknown-limitations.md` |\n\nRead `known-limitations.md` **before** you design entities. It is short, and it\nis where the platform tells you what it will not do.\n\nEverything below is about **this template** — what it turns on, where files go,\nand how its build is wired. For anything about Rayfin itself, use the table.\n\n## Step 1 — turn the data service on\n\nThe base template keeps the `data` service off, because a dashboard over a\nsemantic model does not need a database. Turn it on for an app that needs\npersistence:\n\n```sh\nnpm run pack:add -- data-modeling\n```\n\nThat flips `data.enabled` in `rayfin\u002Frayfin.yml` and plants a starter entity in\n`packages\u002Fdata\u002Fsrc\u002FItem.ts`, registered in `packages\u002Fdata\u002Fsrc\u002Findex.ts`, with its\nisomorphic contract in `packages\u002Fshared\u002Fsrc\u002Findex.ts`.\nRe-applying is safe: it keeps files you have edited, and `--force-seeds` is the\nexplicit way back to the pack's version.\n\nThe template authenticates before rendering app content through its dynamic auth provider and gate.\nKeep that boundary intact and follow the installed `rayfin-guide\u002Fassets\u002Fdocs\u002Fauth\u002F` pages for additional service-specific requirements.\nPreserve server-side entity permissions and row-level security.\nDo not replace an authentication failure with anonymous access or block the entire app because it is outside the Fabric portal.\n\n## Step 2 — write entity files\n\nOne file per entity under `packages\u002Fdata\u002Fsrc\u002F`, for example\n`packages\u002Fdata\u002Fsrc\u002FNote.ts`.\nStart from the seeded `Item.ts` — rename it and change the fields.\nEditing a working entity is more reliable than writing one from nothing.\nWhen the real model replaces the example, remove the unused starter `Item`\nruntime entity, its `packages\u002Fdata\u002Fsrc\u002Findex.ts` registration, and its\n`packages\u002Fshared\u002Fsrc\u002Findex.ts` contract so it does not become user-visible.\n`@microsoft\u002Frayfin-core`, `@microsoft\u002Frayfin-data` and `@microsoft\u002Frayfin-client`\nare already pinned in the base app — nothing to install.\n\nFor the decorator set, field options, relationship syntax, FK naming and the\nmany-to-many rule, read `rayfin-core\u002Fassets\u002Fdocs\u002Fdecorators.md` and\n`rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Foverview.md`, then `known-limitations.md`.\n\n## Step 3 — register entities in this template's schema\n\n`packages\u002Fdata\u002Fsrc\u002Findex.ts` starts with the seeded `Item` registration, while\n`packages\u002Fshared\u002Fsrc\u002Findex.ts` owns its isomorphic record contract and schema\ntype map.\nAdd every entity, including join entities, to both packages:\n\n```ts\n\u002F\u002F packages\u002Fshared\u002Fsrc\u002Findex.ts\nexport interface NoteRecord {\n  id: number;\n  title: string;\n}\n\nexport type UniversalAppSchema = {\n  Note: NoteRecord;\n};\n\n\u002F\u002F packages\u002Fdata\u002Fsrc\u002Findex.ts\nimport { Note } from '.\u002FNote.js';\n\nexport const schema = [Note];\n```\n\n> The client's generic type comes from `UniversalAppSchema` (already referenced by\n> `packages\u002Ffrontend\u002Fsrc\u002Flib\u002Frayfin-client.ts`), so add every entity to both the\n> `schema` array: one registered in the array but missing from the type is\n> reachable at runtime and invisible to the compiler.\n>\n> **Type-check with `tsc -b`, never `tsc --noEmit`.** The workspace packages are\n> referenced TypeScript projects, and the frontend client imports the shared\n> schema type, so\n> a bare `tsc --noEmit` fails with `TS6305` until the referenced project has been\n> built. Run `npm run typecheck` for the real referenced-project check.\n> `npm run build` uses `tsc -b --noCheck` for speed and does not prove the\n> entity types are correct.\n\n## Step 4 — read and write\n\nThe query chain, mutations, `findById`, filtering and paging are documented in\n`rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fgraphql.md` and\n`rayfin-data\u002Fassets\u002Fdocs\u002Findex.md`. Use `await getRayfinClient()` from\n`packages\u002Ffrontend\u002Fsrc\u002Flib\u002Frayfin-client.ts` inside an async query or mutation; that helper is this template's;\nthe API it returns\nis the package's.\n\nFor the interface over your entities — optimistic updates, forms, and the\nloading \u002F empty \u002F error states — read **`crud-ui`**, which ships the kit.\n\n## Step 5 — per-user data\n\n\"Each person sees only their own …\" is a **server-side** `@role` policy, never a\nfilter in the UI. A client-side filter still leaves the rows fetchable.\n\nRead `rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Fpermissions.md` for the decorator, the typed\npolicy DSL, the supported claims, logical composition, and field visibility — it\nis the fullest treatment. `rayfin-core\u002Fassets\u002Fdocs\u002Fpermissions.md` adds the\n`@anonymous` \u002F `@authenticated` shorthands, owner-field typing, and owner\nstamping.\nKeep authentication and authorization on the data operations that require them.\n\n## Notes\n\n- **Stable features only.** Use `@authenticated` \u002F `@role('authenticated', …)`.\n  Anonymous data access on Fabric requires a tenant admin switch — see\n  `rayfin-guide\u002Fassets\u002Fdocs\u002Fdata\u002Foverview.md`. If asked for public data, say so\n  and use authenticated access.\n- **Deploying ships the data model.** A schema change migrates on the next\n  deploy.\n  Read `app-deployment` and follow the installed, version-matched CLI guide.\n\n\u003C!--\nMAINTAINERS: this skill owns *this template* — the data service toggle, the\nworkspace schema shape, the tsc -b build note, and the auth pairing. It does not own\nRayfin.\n\nRayfin's own rules are read at runtime from the installed packages' docs\n(`rayfinDocs.dir`, today `assets\u002Fdocs`), so they cannot drift from the version a\ngenerated app actually has. That replaces the previous arrangement, where this\nfile hand-mirrored rules from the CLI's bundled `skill:rayfin` and had to be\ndiffed against it on every CLI bump. Drift under that arrangement had already\nshipped once: bare `@text()` appeared in every example here while the\nauthoritative rule required an explicit `max` on MSSQL.\n-->\n",{"name":5,"description":7},"main","0979439a7a0806abd0ee48c2619b37f297ae1324","samples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling",73,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-10-30 15:20:57",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add microsoft\u002Frayfin --skill data-modeling",{"tool":53,"command":54},"bunx","bunx skills add microsoft\u002Frayfin --skill data-modeling",{"tool":56,"command":57},"pnpm","pnpm dlx skills add microsoft\u002Frayfin --skill data-modeling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling\u002FSKILL.md",true,[61,67,71,75],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"kit\u002Fdata\u002FItem.ts","SCRIPT","脚本",1828,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling\u002Fkit\u002Fdata\u002FItem.ts",{"path":68,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":69,"sourceHtmlUrl":70},"kit\u002Fdata\u002Fschema.ts",1199,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling\u002Fkit\u002Fdata\u002Fschema.ts",{"path":72,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":73,"sourceHtmlUrl":74},"kit\u002Fshared\u002Findex.ts",464,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling\u002Fkit\u002Fshared\u002Findex.ts",{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"pack.json","REFERENCE","参考文档",884,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fdata-modeling\u002Fpack.json",[82,94,108,117,135,143],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":33},"01M699YEY2QDVPKTZS3HR9AX84","rayfin-getting-started","Use when starting or creating a NEW Rayfin app, or when a Rayfin task comes up and you are not yet inside a Rayfin project. Gets you into a project with the Rayfin CLI, then hands off to the authoritative, version-locked in-project rayfin skill\u002Fdocs that own all in-project work. Triggers: build a Rayfin app, start a Rayfin project, create a new Rayfin app, create-rayfin, npm create @microsoft\u002Frayfin, rayfin init, scaffold rayfin, rayfin CLI, rayfin template, universal app, awesome-rayfin gallery, get started with Rayfin","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fskills\u002Frayfin-getting-started\u002FSKILL.md",[],[89,32,90,91,9,92,93],"rayfin getting started","scaffold","init","docs","cli",{"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":104,"publishedAt":33},"01M699YCN4ZDW2AMDP4NVJ2QGC","visuals","Use when user wants to incorporate charts, graphs, data grid,  or other visual representations of data into their project. Use VegaVisual and DataGrid components to create these visuals,  utilizing the shared DataTable input, formatting, theme, and interactivity. Covers the onInteraction selection\u002Fclick events host apps consume, named multi-table data input for layered overlays and reference lines, and Vega-Lite native selections. Triggers: chart, graph, plot, dashboard, KPI, metric, trend, scorecard, data grid, visualize.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fvisuals\u002FSKILL.md",[100,103],{"categoryNo":101,"categoryName":102,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[96,105,106,107],"components","dashboard","visualize",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":33},"01M699YBEP146MJZJNN8YEBZ2G","schema-discovery","Explore Power BI semantic model schemas using DAX INFO functions. Progressive metadata discovery strategy, scope estimation, and narrowing techniques for tables, columns, measures, and relationships.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fschema-discovery\u002FSKILL.md",[],[115,116],"schema discovery","dax",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":132,"publishedAt":33},"01M699Y9E80WYFKD1S4MT4B1CS","query-design","Separates DAX data-fetching from TypeScript presentation. Guides when to use  DAX vs. TypeScript vs. Vega-Lite for aggregation, total rows, FORMAT(), SELECTCOLUMNS,  BLANK handling, filtering, multi-grain queries, cross-filtering and cross-highlight subset\u002Foverlay queries, and format strings.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fquery-design\u002FSKILL.md",[123,126,129],{"categoryNo":124,"categoryName":125,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":127,"categoryName":128,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":130,"categoryName":131,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师",[133,134,116,30],"query design","design",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":33},"01M699Y7CKZ55QSYFE827RRVJE","functions-capability","Apply and build the Universal App functions capability. Use for trusted server-side logic, secrets, external APIs, custom model endpoints, published Fabric data agents, webhooks, or privileged operations.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Ffunctions-capability\u002FSKILL.md",[],[142],"functions capability",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":33},"01M699Y5R87YE620T78Z30KQSA","fabric-sdk","How to query Fabric data from a running app through the Rayfin connectors client. Use getRayfinClient().connectors.\u003Cname>.executeQuery to run DAX against a semantic model, and toQueryResult to normalize the response.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Ffabric-sdk\u002FSKILL.md",[],[150,151,116,152,32,153],"sdk","fabric sdk","rayfin connectors","connectors"]