[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699XSS22Y3GFE5WD00Z85C9":3,"skill-same:01M699XSS22Y3GFE5WD00Z85C9":48},{"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":18,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M699XSS22Y3GFE5WD00Z85C9","capability-router",null,"Start here for build and feature requests. Resolve the intended data source, select only the required Universal App capabilities, and hand the implementation to one owning skill per capability.","microsoft\u002Frayfin","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M699VK9NEV8GH0Y5JKT1G8XG",657,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fcapability-router\u002FSKILL.md",[],[19],"capability router","2026-11-10 10:12:30",false,"---\nname: capability-router\ndescription: >\n  Start here for build and feature requests.\n  Resolve the intended data source, select only the required Universal App\n  capabilities, and hand the implementation to one owning skill per capability.\n---\n\n# Capability Router\n\nThe base workspace contains dynamic authentication, theming, an error boundary, an authenticated welcome view, and three packages: frontend, data, and shared.\nIt has no live data source, persistence, charting, or trusted server-side logic until a capability pack adds it.\n\n## Decide the source first\n\nPreserve what the user asked to use.\nDo not select a pack from words such as \"dashboard\" or \"workflow\" alone.\n\n| User intent or evidence | Decision |\n| --- | --- |\n| A named semantic model, dataset, or report matches one verified source | Use that source with `analytics` |\n| A supplied Fabric or Power BI URL or explicit IDs | Extract the workspace and item IDs, verify them, and use them |\n| Several sources could match | Ask the user to select the intended source |\n| A named source cannot be found | Ask which source they meant; do not substitute sample data or another model |\n| No source is named | Search a relevant catalog when available, then ask a focused source-or-sample question if still unresolved |\n| The user requested sample data or a mock-up | Use `visuals` and label the sample data visibly |\n| The user supplied a static file for bundling | Review it and emit typed rows; do not imply that the file is a live source |\n\nNever fabricate identifiers, schemas, query output, or business values.\nDo not ask the user to describe a discoverable schema.\nUse the installed tools and version-matched docs to inspect it.\n\nA declared semantic-model app needs its intended model.\nSample data is a separate, user-confirmed route, not a fallback for a missing model.\n\n## Select the capabilities\n\n| Need | Pack command | Seed or implementation anchor | Owning skill |\n| --- | --- | --- | --- |\n| Read an existing Power BI semantic model | `npm run pack:add -- connectors`, then `npm run pack:add -- analytics` | `packages\u002Ffrontend\u002Fsrc\u002Flib\u002Fconnectors.ts`, `packages\u002Ffrontend\u002Fsrc\u002Fhooks\u002Fuse-semantic-model-query.ts`, `packages\u002Ffrontend\u002Fsrc\u002Fqueries\u002F` | [`analytics`](..\u002Fanalytics\u002FSKILL.md) |\n| Chart semantic-model results | `npm run pack:add -- visuals` after analytics | frontend visuals kit and typed visual specifications | [`visuals`](..\u002Fvisuals\u002FSKILL.md) |\n| Chart sample data or app-owned records | `npm run pack:add -- visuals` | frontend visuals kit and typed visual specifications | [`visuals`](..\u002Fvisuals\u002FSKILL.md) |\n| Create and own records | `npm run pack:add -- data-modeling` | `packages\u002Fdata\u002Fsrc\u002FItem.ts`, `packages\u002Fdata\u002Fsrc\u002Findex.ts`, `packages\u002Fshared\u002Fsrc\u002Findex.ts` | [`data-modeling`](..\u002Fdata-modeling\u002FSKILL.md) |\n| Read an existing warehouse, SQL database, or Lakehouse SQL endpoint | `npm run pack:add -- connectors` | `rayfin\u002Frayfin.yml`, `rayfin\u002Fconnectors\u002F\u003Calias>\u002F` | [`connectors`](..\u002Fconnectors\u002FSKILL.md) |\n| Call an external API, webhook, or custom model endpoint | `npm run pack:add -- functions` | `packages\u002Ffunctions\u002Fsrc\u002Ffunction_app.ts` | [`functions-capability`](..\u002Ffunctions-capability\u002FSKILL.md) |\n| Use a secret or trusted operation | `npm run pack:add -- functions` | `packages\u002Ffunctions\u002Fsrc\u002Ffunction_app.ts` | [`functions-capability`](..\u002Ffunctions-capability\u002FSKILL.md) |\n| Call a published Fabric data agent | `npm run pack:add -- functions` | `packages\u002Ffunctions\u002Fsrc\u002Ffunction_app.ts` | [`functions-capability`](..\u002Ffunctions-capability\u002FSKILL.md) |\n| Bundle a supplied CSV or spreadsheet | no pack | a typed module in the owning workspace package | this skill |\n| Use Kusto or KQL | unavailable in this release | none | [`connectors`](..\u002Fconnectors\u002FSKILL.md) |\n\nCapabilities compose.\nAn app that stores records, reads a semantic model, charts results, and calls a trusted API needs four separate pack invocations.\nThe current scaffolder accepts one pack per invocation.\nRun pack commands serially because they mutate workspace manifests, root scripts, and service configuration.\n\nUse `data-modeling` for records the app owns.\nUse `connectors` for records that already exist in a supported Fabric source.\nUse `visuals` for rendering, regardless of whether rows come from sample data, Rayfin data, or analytics.\nUse `functions` only for trusted code, secrets, app identity connections, or server-side calls.\n\nKusto and KQL are not supported in this release.\nSay so and stop rather than swapping in another source.\n\n## Optional consolidated install\n\nWhen several packs are selected, you may avoid a separate install after each\npack without inventing a multi-pack command:\n\n1. Run each selected `npm run pack:add -- \u003Cname> --no-install` command\n   serially.\n2. Inspect every result for preserved files and stop if any pack reports one.\n3. After all packs apply cleanly, run one install from the workspace root:\n\n```sh\nnpm install --ignore-scripts --no-audit --no-fund\n```\n\nThis is a manual authoring optimization, not durable pack caching.\nThe consolidated install does not write the per-pack success markers, so a\nlater ordinary pack reapply may install again.\n\n## Preserve workspace ownership\n\nRun pack and lifecycle commands from the workspace root.\nThe pack manifest selects the package manifest that owns its dependencies:\n\n- Frontend and connector dependencies belong in `packages\u002Ffrontend\u002Fpackage.json`.\n- Decorated entities belong in `packages\u002Fdata`, while browser-safe record contracts belong in `packages\u002Fshared`.\n- The functions pack creates `packages\u002Ffunctions` and composes it into the root build and typecheck scripts.\n\nDo not create nested lockfiles or install dependencies separately inside workspace packages.\nDo not import decorated entity classes into frontend code.\n\n## Apply and hand off\n\nApply selected packs before editing files they seed.\nIf a pack preserves an existing file, report it and stop instead of assuming the pack's contract is installed.\nUse `--force-seeds` only with explicit user approval.\n\nAfter routing:\n\n1. Read the owning skill for each selected capability.\n2. Read the relevant seed files and exact installed package documentation in parallel where independent.\n3. Establish a runnable shell in `packages\u002Ffrontend` with honest loading states, preserving protected hosting and the dynamic auth gate.\n4. Verify real query or operation output before writing code that consumes its fields.\n5. Integrate data, interactions, and polish, then follow `AGENTS.md` for final validation and deployment.\n\nSubstantial independent discovery or implementation may be delegated behind a clear interface.\nDo not fan out a tiny app or tightly coupled flow merely because parallel agents are available.\n","# Capability Router\n\nThe base workspace contains dynamic authentication, theming, an error boundary, an authenticated welcome view, and three packages: frontend, data, and shared.\nIt has no live data source, persistence, charting, or trusted server-side logic until a capability pack adds it.\n\n## Decide the source first\n\nPreserve what the user asked to use.\nDo not select a pack from words such as \"dashboard\" or \"workflow\" alone.\n\n| User intent or evidence | Decision |\n| --- | --- |\n| A named semantic model, dataset, or report matches one verified source | Use that source with `analytics` |\n| A supplied Fabric or Power BI URL or explicit IDs | Extract the workspace and item IDs, verify them, and use them |\n| Several sources could match | Ask the user to select the intended source |\n| A named source cannot be found | Ask which source they meant; do not substitute sample data or another model |\n| No source is named | Search a relevant catalog when available, then ask a focused source-or-sample question if still unresolved |\n| The user requested sample data or a mock-up | Use `visuals` and label the sample data visibly |\n| The user supplied a static file for bundling | Review it and emit typed rows; do not imply that the file is a live source |\n\nNever fabricate identifiers, schemas, query output, or business values.\nDo not ask the user to describe a discoverable schema.\nUse the installed tools and version-matched docs to inspect it.\n\nA declared semantic-model app needs its intended model.\nSample data is a separate, user-confirmed route, not a fallback for a missing model.\n\n## Select the capabilities\n\n| Need | Pack command | Seed or implementation anchor | Owning skill |\n| --- | --- | --- | --- |\n| Read an existing Power BI semantic model | `npm run pack:add -- connectors`, then `npm run pack:add -- analytics` | `packages\u002Ffrontend\u002Fsrc\u002Flib\u002Fconnectors.ts`, `packages\u002Ffrontend\u002Fsrc\u002Fhooks\u002Fuse-semantic-model-query.ts`, `packages\u002Ffrontend\u002Fsrc\u002Fqueries\u002F` | [`analytics`](..\u002Fanalytics\u002FSKILL.md) |\n| Chart semantic-model results | `npm run pack:add -- visuals` after analytics | frontend visuals kit and typed visual specifications | [`visuals`](..\u002Fvisuals\u002FSKILL.md) |\n| Chart sample data or app-owned records | `npm run pack:add -- visuals` | frontend visuals kit and typed visual specifications | [`visuals`](..\u002Fvisuals\u002FSKILL.md) |\n| Create and own records | `npm run pack:add -- data-modeling` | `packages\u002Fdata\u002Fsrc\u002FItem.ts`, `packages\u002Fdata\u002Fsrc\u002Findex.ts`, `packages\u002Fshared\u002Fsrc\u002Findex.ts` | [`data-modeling`](..\u002Fdata-modeling\u002FSKILL.md) |\n| Read an existing warehouse, SQL database, or Lakehouse SQL endpoint | `npm run pack:add -- connectors` | `rayfin\u002Frayfin.yml`, `rayfin\u002Fconnectors\u002F\u003Calias>\u002F` | [`connectors`](..\u002Fconnectors\u002FSKILL.md) |\n| Call an external API, webhook, or custom model endpoint | `npm run pack:add -- functions` | `packages\u002Ffunctions\u002Fsrc\u002Ffunction_app.ts` | [`functions-capability`](..\u002Ffunctions-capability\u002FSKILL.md) |\n| Use a secret or trusted operation | `npm run pack:add -- functions` | `packages\u002Ffunctions\u002Fsrc\u002Ffunction_app.ts` | [`functions-capability`](..\u002Ffunctions-capability\u002FSKILL.md) |\n| Call a published Fabric data agent | `npm run pack:add -- functions` | `packages\u002Ffunctions\u002Fsrc\u002Ffunction_app.ts` | [`functions-capability`](..\u002Ffunctions-capability\u002FSKILL.md) |\n| Bundle a supplied CSV or spreadsheet | no pack | a typed module in the owning workspace package | this skill |\n| Use Kusto or KQL | unavailable in this release | none | [`connectors`](..\u002Fconnectors\u002FSKILL.md) |\n\nCapabilities compose.\nAn app that stores records, reads a semantic model, charts results, and calls a trusted API needs four separate pack invocations.\nThe current scaffolder accepts one pack per invocation.\nRun pack commands serially because they mutate workspace manifests, root scripts, and service configuration.\n\nUse `data-modeling` for records the app owns.\nUse `connectors` for records that already exist in a supported Fabric source.\nUse `visuals` for rendering, regardless of whether rows come from sample data, Rayfin data, or analytics.\nUse `functions` only for trusted code, secrets, app identity connections, or server-side calls.\n\nKusto and KQL are not supported in this release.\nSay so and stop rather than swapping in another source.\n\n## Optional consolidated install\n\nWhen several packs are selected, you may avoid a separate install after each\npack without inventing a multi-pack command:\n\n1. Run each selected `npm run pack:add -- \u003Cname> --no-install` command\n   serially.\n2. Inspect every result for preserved files and stop if any pack reports one.\n3. After all packs apply cleanly, run one install from the workspace root:\n\n```sh\nnpm install --ignore-scripts --no-audit --no-fund\n```\n\nThis is a manual authoring optimization, not durable pack caching.\nThe consolidated install does not write the per-pack success markers, so a\nlater ordinary pack reapply may install again.\n\n## Preserve workspace ownership\n\nRun pack and lifecycle commands from the workspace root.\nThe pack manifest selects the package manifest that owns its dependencies:\n\n- Frontend and connector dependencies belong in `packages\u002Ffrontend\u002Fpackage.json`.\n- Decorated entities belong in `packages\u002Fdata`, while browser-safe record contracts belong in `packages\u002Fshared`.\n- The functions pack creates `packages\u002Ffunctions` and composes it into the root build and typecheck scripts.\n\nDo not create nested lockfiles or install dependencies separately inside workspace packages.\nDo not import decorated entity classes into frontend code.\n\n## Apply and hand off\n\nApply selected packs before editing files they seed.\nIf a pack preserves an existing file, report it and stop instead of assuming the pack's contract is installed.\nUse `--force-seeds` only with explicit user approval.\n\nAfter routing:\n\n1. Read the owning skill for each selected capability.\n2. Read the relevant seed files and exact installed package documentation in parallel where independent.\n3. Establish a runnable shell in `packages\u002Ffrontend` with honest loading states, preserving protected hosting and the dynamic auth gate.\n4. Verify real query or operation output before writing code that consumes its fields.\n5. Integrate data, interactions, and polish, then follow `AGENTS.md` for final validation and deployment.\n\nSubstantial independent discovery or implementation may be delegated behind a clear interface.\nDo not fan out a tiny app or tightly coupled flow merely because parallel agents are available.\n",{"name":5,"description":7},"main","0979439a7a0806abd0ee48c2619b37f297ae1324","samples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fcapability-router",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-11-12 01:21:10",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add microsoft\u002Frayfin --skill capability-router",{"tool":40,"command":41},"bunx","bunx skills add microsoft\u002Frayfin --skill capability-router",{"tool":43,"command":44},"pnpm","pnpm dlx skills add microsoft\u002Frayfin --skill capability-router","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002Fsamples\u002Funiversal-app\u002Ftemplate\u002F.agents\u002Fskills\u002Fcapability-router\u002FSKILL.md",true,[],[49,62,82,91,110,118],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":20},"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",[],[56,57,58,59,9,60,61],"rayfin getting started","rayfin","scaffold","init","docs","cli",{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":78,"publishedAt":20},"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",[68,73],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000013","分析与可视化","SCENARIO","使用场景",{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[64,79,80,81],"components","dashboard","visualize",{"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":20},"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",[],[89,90],"schema discovery","dax",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":106,"publishedAt":20},"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",[97,100,103],{"categoryNo":98,"categoryName":99,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":101,"categoryName":102,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":104,"categoryName":105,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000032","设计师",[107,108,90,109],"query design","design","typescript",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":20},"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",[],[117],"functions capability",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":20},"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",[],[125,126,90,127,57,128],"sdk","fabric sdk","rayfin connectors","connectors"]