[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699WM262ZF23D4S690P9NA0":3,"skill-same:01M699WM262ZF23D4S690P9NA0":83},{"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":23,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":42,"ownerDescription":43,"updatedAt":44,"install":45,"resources":58},"01M699WM262ZF23D4S690P9NA0","run-cli-e2e-locally",null,"Run the CLI E2E tests locally using your own user credentials instead of a service principal. Use when: run e2e locally, run cli tests, test with my credentials, local e2e, e2e user auth, run fabric tests locally.","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\u002F.github\u002Fskills\u002Frun-cli-e2e-locally\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27],"cli","run cli e2e locally","test","auth","2026-11-10 10:12:30",false,"---\nname: run-cli-e2e-locally\ndescription: >-\n  Run the CLI E2E tests locally using your own user credentials instead of\n  a service principal. Use when: run e2e locally, run cli tests, test with\n  my credentials, local e2e, e2e user auth, run fabric tests locally.\nlicense: MIT\nmetadata:\n  author: rayfin\n  version: \"2.0\"\n---\n\nHelp a developer run the CLI E2E tests locally using their own Azure AD credentials.\n\n**Prerequisites**:\n\n- The repo is cloned and Rush dependencies are installed (`rush update`)\n- The CLI and E2E packages are built (`rush build --to rayfin-cli-e2e`)\n- The user has an Azure AD account with access to the target Fabric workspace\n\n## Steps\n\n### 1. Create the local environment file\n\nCreate `packages\u002Ftools\u002Fcli-e2e\u002F.env` (this file is gitignored):\n\n```env\nE2E_AUTH_MODE=user\nE2E_ENVIRONMENT=daily\nE2E_TENANT_ID=\u003Cyour-tenant-id>\nE2E_CLI_SOURCE=source\nUSE_LOCAL_PACKAGES=true\nRAYFIN_E2E_WORKSPACE_NAME=DO_NOT_DELETE_AppDev_E2E_Workspace\nRAYFIN_TELEMETRY_OPTOUT=1\nRAYFIN_ENCRYPTION_FALLBACK_ENABLED=true\n```\n\nReplace `\u003Cyour-tenant-id>` with the user's Azure AD tenant ID.\n\nIf the user doesn't know their tenant ID, suggest:\n\n```bash\nrayfin login status\n```\n\nor check the Azure Portal under **Microsoft Entra ID → Overview → Tenant ID**.\n\n### 2. Run the tests\n\nFrom `packages\u002Ftools\u002Fcli-e2e`:\n\n```bash\nrushx test:e2e\n```\n\n**Login is automatic.**\nThe test suite includes a `globalSetup` that checks for an existing user session before tests run.\nIf no valid user session exists, it automatically runs `rayfin login --tenant \u003CE2E_TENANT_ID>` which opens the browser for interactive sign-in.\nAfter authenticating once, subsequent test runs reuse the cached session without prompting again.\n\nTo run a specific test file:\n\n```bash\nrushx test:e2e -- src\u002Finit\u002Finit.test.ts\n```\n\nTo run with coverage:\n\n```bash\nrushx test:e2e:coverage\n```\n\nTo run in watch mode during development:\n\n```bash\nrushx test:e2e:watch\n```\n\n### 3. Run the Playwright browser E2E tests\n\nFirst install Playwright browsers (one-time):\n\n```bash\nnpx playwright install chromium\n```\n\nThen run the browser tests:\n\n```bash\nrushx test:e2e:browser\n```\n\n**Note**: The browser tests deploy to a Fabric workspace and navigate to the hosted URL.\nThey require the user's account to have Contributor access to the `DO_NOT_DELETE_AppDev_E2E_Workspace` workspace.\nThe Playwright tests do **not** use the Vitest globalSetup, so the user must have a valid session from a prior `rushx test:e2e` run or manual `rayfin login --tenant \u003Cid>`.\n\n### 4. Troubleshooting\n\n| Symptom | Fix |\n|---------|-----|\n| `E2E_AUTH_MODE=user requires E2E_TENANT_ID to be set` | Fill in `E2E_TENANT_ID` in your `.env` file |\n| `Interactive login failed` + browser did not open | Run manually: `rayfin login --tenant \u003Cid>` |\n| `Silent token acquisition failed` | Token expired — re-run `rayfin login --tenant \u003Cid>` or delete `~\u002F.rayfin\u002Fauth.json` and retry |\n| `Workspace not found` | Verify your account has access to `DO_NOT_DELETE_AppDev_E2E_Workspace` in the daily Fabric environment |\n| Tests skip with `Skipped: authMode === 'user'` | Expected — SP-specific tests are skipped in user mode |\n| Tests skip with `data-client tests require SP credentials` | Expected — data-client tests need SP secrets |\n| Keychain errors (WSL\u002Fcontainers) | Set `RAYFIN_ENCRYPTION_FALLBACK_ENABLED=true` in `.env` |\n| Windows libuv assertion crash during login | Harmless — the globalSetup checks CLI output content, not exit code |\n\n## How It Works\n\n- **Automatic login via globalSetup**: The Vitest config references `src\u002Fglobal-setup.ts` which runs before all tests.\n  When `E2E_AUTH_MODE=user`, it checks `rayfin login status` output.\n  If not signed in as a user, it triggers `rayfin login --tenant \u003CE2E_TENANT_ID>` (opens browser).\n  On subsequent runs, the cached session is reused and login is skipped.\n- **Output-based detection**: On Windows, `rayfin login` may crash during process cleanup (libuv assertion) even after success.\n  The setup checks for `\"Signed in successfully\"` in stdout rather than relying on exit code.\n- **Auth state sharing**: CLI commands in tests inherit the user's auth from `~\u002F.rayfin\u002Fauth.json`.\n  Direct Fabric API calls acquire a token silently from the MSAL cache via the CLI's `getAuthenticatedToken()` function.\n- **Test skipping**: Service principal-specific tests (SP login, SP logout) are automatically skipped via `it.skipIf(authMode === 'user')`.\n- **CI isolation**: CI always sets `E2E_AUTH_MODE=sp` with pipeline secrets.\n  Local `.env` files are gitignored and never affect CI.\n","Help a developer run the CLI E2E tests locally using their own Azure AD credentials.\n\n**Prerequisites**:\n\n- The repo is cloned and Rush dependencies are installed (`rush update`)\n- The CLI and E2E packages are built (`rush build --to rayfin-cli-e2e`)\n- The user has an Azure AD account with access to the target Fabric workspace\n\n## Steps\n\n### 1. Create the local environment file\n\nCreate `packages\u002Ftools\u002Fcli-e2e\u002F.env` (this file is gitignored):\n\n```env\nE2E_AUTH_MODE=user\nE2E_ENVIRONMENT=daily\nE2E_TENANT_ID=\u003Cyour-tenant-id>\nE2E_CLI_SOURCE=source\nUSE_LOCAL_PACKAGES=true\nRAYFIN_E2E_WORKSPACE_NAME=DO_NOT_DELETE_AppDev_E2E_Workspace\nRAYFIN_TELEMETRY_OPTOUT=1\nRAYFIN_ENCRYPTION_FALLBACK_ENABLED=true\n```\n\nReplace `\u003Cyour-tenant-id>` with the user's Azure AD tenant ID.\n\nIf the user doesn't know their tenant ID, suggest:\n\n```bash\nrayfin login status\n```\n\nor check the Azure Portal under **Microsoft Entra ID → Overview → Tenant ID**.\n\n### 2. Run the tests\n\nFrom `packages\u002Ftools\u002Fcli-e2e`:\n\n```bash\nrushx test:e2e\n```\n\n**Login is automatic.**\nThe test suite includes a `globalSetup` that checks for an existing user session before tests run.\nIf no valid user session exists, it automatically runs `rayfin login --tenant \u003CE2E_TENANT_ID>` which opens the browser for interactive sign-in.\nAfter authenticating once, subsequent test runs reuse the cached session without prompting again.\n\nTo run a specific test file:\n\n```bash\nrushx test:e2e -- src\u002Finit\u002Finit.test.ts\n```\n\nTo run with coverage:\n\n```bash\nrushx test:e2e:coverage\n```\n\nTo run in watch mode during development:\n\n```bash\nrushx test:e2e:watch\n```\n\n### 3. Run the Playwright browser E2E tests\n\nFirst install Playwright browsers (one-time):\n\n```bash\nnpx playwright install chromium\n```\n\nThen run the browser tests:\n\n```bash\nrushx test:e2e:browser\n```\n\n**Note**: The browser tests deploy to a Fabric workspace and navigate to the hosted URL.\nThey require the user's account to have Contributor access to the `DO_NOT_DELETE_AppDev_E2E_Workspace` workspace.\nThe Playwright tests do **not** use the Vitest globalSetup, so the user must have a valid session from a prior `rushx test:e2e` run or manual `rayfin login --tenant \u003Cid>`.\n\n### 4. Troubleshooting\n\n| Symptom | Fix |\n|---------|-----|\n| `E2E_AUTH_MODE=user requires E2E_TENANT_ID to be set` | Fill in `E2E_TENANT_ID` in your `.env` file |\n| `Interactive login failed` + browser did not open | Run manually: `rayfin login --tenant \u003Cid>` |\n| `Silent token acquisition failed` | Token expired — re-run `rayfin login --tenant \u003Cid>` or delete `~\u002F.rayfin\u002Fauth.json` and retry |\n| `Workspace not found` | Verify your account has access to `DO_NOT_DELETE_AppDev_E2E_Workspace` in the daily Fabric environment |\n| Tests skip with `Skipped: authMode === 'user'` | Expected — SP-specific tests are skipped in user mode |\n| Tests skip with `data-client tests require SP credentials` | Expected — data-client tests need SP secrets |\n| Keychain errors (WSL\u002Fcontainers) | Set `RAYFIN_ENCRYPTION_FALLBACK_ENABLED=true` in `.env` |\n| Windows libuv assertion crash during login | Harmless — the globalSetup checks CLI output content, not exit code |\n\n## How It Works\n\n- **Automatic login via globalSetup**: The Vitest config references `src\u002Fglobal-setup.ts` which runs before all tests.\n  When `E2E_AUTH_MODE=user`, it checks `rayfin login status` output.\n  If not signed in as a user, it triggers `rayfin login --tenant \u003CE2E_TENANT_ID>` (opens browser).\n  On subsequent runs, the cached session is reused and login is skipped.\n- **Output-based detection**: On Windows, `rayfin login` may crash during process cleanup (libuv assertion) even after success.\n  The setup checks for `\"Signed in successfully\"` in stdout rather than relying on exit code.\n- **Auth state sharing**: CLI commands in tests inherit the user's auth from `~\u002F.rayfin\u002Fauth.json`.\n  Direct Fabric API calls acquire a token silently from the MSAL cache via the CLI's `getAuthenticatedToken()` function.\n- **Test skipping**: Service principal-specific tests (SP login, SP logout) are automatically skipped via `it.skipIf(authMode === 'user')`.\n- **CI isolation**: CI always sets `E2E_AUTH_MODE=sp` with pipeline secrets.\n  Local `.env` files are gitignored and never affect CI.\n",{"name":5,"license":15,"metadata":33,"description":7},{"author":34,"version":35},"rayfin","2.0","main","0979439a7a0806abd0ee48c2619b37f297ae1324",".github\u002Fskills\u002Frun-cli-e2e-locally",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":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add microsoft\u002Frayfin --skill run-cli-e2e-locally",{"tool":51,"command":52},"bunx","bunx skills add microsoft\u002Frayfin --skill run-cli-e2e-locally",{"tool":54,"command":55},"pnpm","pnpm dlx skills add microsoft\u002Frayfin --skill run-cli-e2e-locally","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frayfin\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frun-cli-e2e-locally\u002FSKILL.md",true,[59,65,69,73,79],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},"examples\u002Fconsole_logging.py","SCRIPT","脚本",1027,"https:\u002F\u002Fgithub.com\u002FKarryViber\u002FOrb\u002Fblob\u002Fmain\u002Fprofiles\u002F.claude\u002Fskills\u002Fwebapp-testing\u002Fexamples\u002Fconsole_logging.py",{"path":66,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":67,"sourceHtmlUrl":68},"examples\u002Felement_discovery.py",1463,"https:\u002F\u002Fgithub.com\u002FKarryViber\u002FOrb\u002Fblob\u002Fmain\u002Fprofiles\u002F.claude\u002Fskills\u002Fwebapp-testing\u002Fexamples\u002Felement_discovery.py",{"path":70,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":71,"sourceHtmlUrl":72},"examples\u002Fstatic_html_automation.py",953,"https:\u002F\u002Fgithub.com\u002FKarryViber\u002FOrb\u002Fblob\u002Fmain\u002Fprofiles\u002F.claude\u002Fskills\u002Fwebapp-testing\u002Fexamples\u002Fstatic_html_automation.py",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"LICENSE.txt","LICENSE","许可证",11345,"https:\u002F\u002Fgithub.com\u002FKarryViber\u002FOrb\u002Fblob\u002Fmain\u002Fprofiles\u002F.claude\u002Fskills\u002Fwebapp-testing\u002FLICENSE.txt",{"path":80,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fwith_server.py",3693,"https:\u002F\u002Fgithub.com\u002FKarryViber\u002FOrb\u002Fblob\u002Fmain\u002Fprofiles\u002F.claude\u002Fskills\u002Fwebapp-testing\u002Fscripts\u002Fwith_server.py",[84,95,113,122,141,149],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":28},"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",[],[91,34,92,93,9,94,24],"rayfin getting started","scaffold","init","docs",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":109,"publishedAt":28},"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",[101,104],{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[97,110,111,112],"components","dashboard","visualize",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":28},"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",[],[120,121],"schema discovery","dax",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":137,"publishedAt":28},"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",[128,131,134],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":132,"categoryName":133,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":135,"categoryName":136,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000032","设计师",[138,139,121,140],"query design","design","typescript",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":28},"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",[],[148],"functions capability",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":28},"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",[],[156,157,121,158,34,159],"sdk","fabric sdk","rayfin connectors","connectors"]