[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BSRV752CSC1NBMFWDCKB5":3,"skill-same:01M69BSRV752CSC1NBMFWDCKB5":69},{"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":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M69BSRV752CSC1NBMFWDCKB5","tree-cluster-architecture",null,"Patterns for cluster nodes and tree data providers in vscode-documentdb. Use when adding or changing a cluster tree item, discovery provider, Connections\u002FAzure\u002FDiscovery tree hierarchy, tree\u002Flist mode, cluster identity, treeId\u002FclusterId lookup, Collection View import\u002Fexport resolution, reveal behavior, credentials, shell actions, or copy connection string support.","microsoft\u002Fvscode-documentdb","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BRX0BQJ0QGRNCNZAAAXBV",33,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ftree-cluster-architecture\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"architecture","tree cluster architecture","tree","cluster","import","STRING","Providers","patterns","list","data","export","reveal","credentials","hierarchy","collection","when","mode","actions","identity","vscode","support","azure","2026-11-10 10:12:30",false,"---\nname: tree-cluster-architecture\ndescription: Patterns for cluster nodes and tree data providers in vscode-documentdb. Use when adding or changing a cluster tree item, discovery provider, Connections\u002FAzure\u002FDiscovery tree hierarchy, tree\u002Flist mode, cluster identity, treeId\u002FclusterId lookup, Collection View import\u002Fexport resolution, reveal behavior, credentials, shell actions, or copy connection string support.\n---\n\n# Tree Cluster Architecture\n\nUse this skill whenever a tree node represents a database cluster or a hierarchy change can move a cluster node.\n\n## Non-Negotiable Rule\n\nEvery **browsable cluster node** must extend `ClusterItemBase\u003CTModel>` from `src\u002Ftree\u002Fdocumentdb\u002FClusterItemBase.ts`.\n\nDo not implement a cluster as a plain `TreeElement` or `createGenericElement*` node. Hand-rolled cluster nodes silently lose shared behavior and force each feature to reimplement it:\n\n- database and collection expansion\n- credential\u002Fclient cache integration\n- retry and open-shell recovery nodes\n- the canonical `treeItem_documentdbcluster` context tag\n- standard command\u002Fmenu eligibility\n- `getCredentials()` used by Copy Connection String and Save\u002FAdd to Connections flows\n- consistent connection progress, cancellation, and error handling\n\nGeneric tree elements are appropriate for structural parents, placeholders, actions, and **non-browsable state rows**. When a state becomes browsable, render a `ClusterItemBase` subclass.\n\n## Implementing a Cluster Item\n\n1. Define a model extending `BaseClusterModel`.\n2. Construct a `TreeCluster\u003CTModel>` containing both stable identity and tree position.\n3. Extend `ClusterItemBase\u003CTModel>` and call `super(cluster)`.\n4. Implement:\n   - `getCredentials(): Promise\u003CEphemeralClusterCredentials | undefined>`\n   - `authenticateAndConnect(): Promise\u003CClustersClient | null>`\n5. Optionally override:\n   - `beforeCachedClientConnect()` for tunnels or reachability preparation\n   - presentation through `descriptionOverride`, `tooltipOverride`, `iconPath`, or a justified `getTreeItem()` override\n6. Preserve the base context value. Add feature tags with `createContextValue([this.contextValue, ...extraTags])`; never replace it with a string that omits `treeItem_documentdbcluster`.\n7. Use `this.cluster.clusterId` for `CredentialCache` and `ClustersClient`, never `this.id`.\n\nRepresentative subclasses:\n\n- Stored connection: `src\u002Ftree\u002Fconnections-view\u002FDocumentDBClusterItem.ts`\n- Kubernetes discovery: `src\u002Fplugins\u002Fservice-kubernetes\u002Fdiscovery-tree\u002Fdocumentdb\u002FKubernetesResourceItem.ts`\n- Atlas discovery: `src\u002Fplugins\u002Fservice-atlas-mongodb\u002Fdiscovery-tree\u002FAtlasClusterItem.ts`\n- Managed synthetic cluster: `QuickStartClusterItem` in `src\u002Ftree\u002Fconnections-view\u002FLocalQuickStart\u002FLocalQuickStartItem.ts`\n\n## Dual Identity Contract\n\nA cluster has two IDs with different ownership:\n\n| ID          | Meaning                            | Stability                                      | Valid uses                                                                       |\n| ----------- | ---------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------- |\n| `clusterId` | Stable resource\u002Fcache identity     | Must survive tree moves and layout changes     | credentials, clients, sessions, serialized webview context, reverse lookup input |\n| `treeId`    | Current hierarchical tree position | May change with folders, parents, or view mode | `TreeElement.id`, child IDs, reveal\u002Fnavigation                                   |\n\nRules:\n\n- `clusterId` must not contain `\u002F`.\n- `treeId` must represent the node's actual rendered path.\n- `viewId` must identify the branch provider that owns the rendered node.\n- Child IDs derive from `treeId`, using helpers such as `buildDatabaseTreeId()` and `buildCollectionTreeId()`.\n- Never cache by `treeId` or `this.id`.\n- Never assume a stable ID is also a tree path unless the provider explicitly guarantees `clusterId === treeId`.\n- Never change tree construction without checking reverse lookup from `clusterId`.\n\n## Design Rendering and Lookup Together\n\nWhen adding a cluster hierarchy or a tree\u002Flist mode, specify these four functions before coding:\n\n1. **Stable identity:** How is `clusterId` built and made collision-safe?\n2. **Rendering:** How is `treeId` built in every layout?\n3. **Ownership:** Which branch provider receives `viewId` and `clusterId` later?\n4. **Reverse lookup:** How does that provider recover the current `treeId` and then the collection node?\n\nThe round trip must hold:\n\n```text\nrendered cluster\n  -> { clusterId, treeId, viewId }\n  -> open Collection View with { clusterId, viewId }\n  -> owning provider resolves current treeId\n  -> provider resolves \u003CtreeId>\u002F\u003Cdatabase>\u002F\u003Ccollection>\n```\n\n### Connections View\n\nPersisted connections use `clusterId = storageId`. Reconstruct the current folder path from storage with `buildFullTreePath()`; do not persist or guess an old `treeId`.\n\nSynthetic nodes are not in connection storage. Their feature must own:\n\n- an exact, side-effect-free ownership predicate\n- tree path builders used by rendering and reveal code\n- stable-ID-to-tree-ID resolution\n\nThe Connections provider may dispatch to that feature before falling back to persisted storage. Classify ownership **before invoking feature code**, so a feature resolver failure cannot break ordinary stored connections. See:\n\n- `src\u002Ftree\u002Fconnections-view\u002FresolveConnectionsClusterTreeId.ts`\n- `src\u002Ftree\u002Fconnections-view\u002FLocalQuickStart\u002FquickStartTreeIdentity.ts`\n\nDo not put feature-specific ID prefixes or synthetic paths into `buildFullTreePath()`.\n\n### Discovery View\n\n`clusterId` is provider-prefixed. The current `DiscoveryBranchDataProvider` removes that prefix and finds a cached tree node by its final suffix. Therefore every layout for that provider must end the cluster `treeId` with the same stable unprefixed suffix.\n\n- Preserve visible hierarchy in preceding path segments.\n- Use one helper to build the stable suffix for both `clusterId` and every tree layout.\n- Make the suffix collision-safe within the provider.\n- Test tree and list modes separately.\n- Do not rely on cluster display names alone when uniqueness is scoped by project, namespace, context, or source.\n\nThis suffix lookup is a current compatibility contract, not an ideal general identity mechanism. Issue #869 tracks exact stable-identity lookup. Until that changes, new Discovery providers must satisfy the suffix contract.\n\n### Azure Resources View\n\nDirect lookup is valid only where the provider intentionally guarantees `clusterId === treeId`. Document that invariant and test it.\n\n## Provider Responsibilities\n\nBranch providers must implement both when their clusters can open Collection View:\n\n- `findClusterNodeByClusterId(clusterId)`\n- `findCollectionByClusterId(clusterId, databaseName, collectionName)`\n\nPrefer one shared cluster-ID-to-tree-ID resolver so cluster and collection lookup cannot drift. Once the cluster node is known, use scoped child lookup to avoid expanding unrelated branches.\n\nDo not silently fall back between providers or storage zones unless identity ownership is explicit. An owned but currently unavailable synthetic cluster should return `undefined`, not masquerade as a persisted connection.\n\n## Required Tests for New Cluster Nodes or Layouts\n\nAdd focused tests before considering the feature complete.\n\n### 1. Base cluster behavior\n\n- The browsable item is a `ClusterItemBase` subclass.\n- Its context value retains `treeItem_documentdbcluster` plus feature tags.\n- `getCredentials()` is implemented for commands that need connection material.\n- Expansion returns database nodes and base failure paths return retry\u002Fopen-shell nodes as applicable.\n\nUse `src\u002Ftree\u002Fdocumentdb\u002FClusterItemBase.test.ts` as the base-behavior reference.\n\n### 2. Identity invariants\n\n- `clusterId` is stable and slash-free.\n- Moving folders or switching layout changes only `treeId`, not `clusterId`.\n- IDs remain unique where display names can repeat.\n- Cache operations use `clusterId`, not `treeId`.\n\nUse `src\u002Ftree\u002Fconnections-view\u002Fmodels\u002FConnectionClusterModel.test.ts` as a reference.\n\n### 3. Render-to-lookup round trip (mandatory)\n\nConstruct the cluster through the **real parent\u002Froot item**, not only as a model fixture, then assert:\n\n```typescript\nexpect(rendered.cluster.clusterId).toBe(expectedStableId);\nexpect(rendered.cluster.treeId).toBe(expectedTreePath);\nexpect(await provider.findClusterNodeByClusterId(rendered.cluster.clusterId)).toBe(rendered);\nexpect(await provider.findCollectionByClusterId(rendered.cluster.clusterId, databaseName, collectionName)).toBe(\n  expectedCollection,\n);\n```\n\nThis test must exist for every materially different layout: root\u002Ffolder, tree\u002Flist, or other synthetic hierarchy. It would have caught both the Atlas suffix mismatch and the Quick Start storage-path mismatch.\n\n### 4. Ownership isolation for synthetic nodes\n\n- Exact owned ID uses the feature resolver.\n- Ordinary IDs never invoke the feature resolver.\n- Owned-but-unavailable IDs do not fall through to persisted lookup.\n- A feature resolver failure cannot affect ordinary persisted lookup.\n\nUse `src\u002Ftree\u002Fconnections-view\u002FresolveConnectionsClusterTreeId.test.ts` as a reference.\n\n### 5. Command compatibility\n\nAt minimum, verify the context contract and `getCredentials()` path needed by:\n\n- Copy Connection String\n- Open Shell\n- Save\u002FAdd to Connections when enabled\n\nIf a command is intentionally unavailable, gate it explicitly with context values and document why; do not omit base behavior accidentally.\n\n## Failure Presentation: Actions Only\n\nThe tree shows **actions, never error or information rows**. When expanding a cluster fails, the\nreason goes in a **modal** (`showErrorMessage(..., { modal: true, detail })`, translated through\n`ErrorExplanationService` where available). The children are only recovery actions: Retry,\n\"Diagnose this connection…\", \"Click here to open the shell\" (on every failure, so experts can debug\nin the shell even when connecting or sign-in failed), and provider-owned\nactions such as \"Update credentials…\" via `errorRecoveryActions`\n(`ClusterItemBase.createErrorRecoveryChildren`).\n\nDo not add a child whose purpose is to show a message (an error label, a \"sign-in required\" row,\na tooltip-only info node), even with an icon. Better wording belongs in the modal and in the\nDiagnose connection panel, not in the tree.\n\n## Review Checklist\n\nBefore approving a cluster tree change, answer yes to all:\n\n- [ ] Browsable cluster extends `ClusterItemBase`.\n- [ ] Base cluster context tag is preserved.\n- [ ] `clusterId`, `treeId`, and `viewId` have documented owners.\n- [ ] Credentials and clients use `clusterId` only.\n- [ ] Every rendered layout has a reverse lookup strategy.\n- [ ] Cluster and collection lookup share one resolver.\n- [ ] Synthetic ownership is exact and isolated from stored lookup.\n- [ ] IDs are collision-safe beyond display names.\n- [ ] A real render-to-lookup round-trip test covers every layout.\n- [ ] Standard cluster commands work or are explicitly gated off.\n- [ ] Failures show a modal; tree children are recovery actions only, never error or info rows.\n","# Tree Cluster Architecture\n\nUse this skill whenever a tree node represents a database cluster or a hierarchy change can move a cluster node.\n\n## Non-Negotiable Rule\n\nEvery **browsable cluster node** must extend `ClusterItemBase\u003CTModel>` from `src\u002Ftree\u002Fdocumentdb\u002FClusterItemBase.ts`.\n\nDo not implement a cluster as a plain `TreeElement` or `createGenericElement*` node. Hand-rolled cluster nodes silently lose shared behavior and force each feature to reimplement it:\n\n- database and collection expansion\n- credential\u002Fclient cache integration\n- retry and open-shell recovery nodes\n- the canonical `treeItem_documentdbcluster` context tag\n- standard command\u002Fmenu eligibility\n- `getCredentials()` used by Copy Connection String and Save\u002FAdd to Connections flows\n- consistent connection progress, cancellation, and error handling\n\nGeneric tree elements are appropriate for structural parents, placeholders, actions, and **non-browsable state rows**. When a state becomes browsable, render a `ClusterItemBase` subclass.\n\n## Implementing a Cluster Item\n\n1. Define a model extending `BaseClusterModel`.\n2. Construct a `TreeCluster\u003CTModel>` containing both stable identity and tree position.\n3. Extend `ClusterItemBase\u003CTModel>` and call `super(cluster)`.\n4. Implement:\n   - `getCredentials(): Promise\u003CEphemeralClusterCredentials | undefined>`\n   - `authenticateAndConnect(): Promise\u003CClustersClient | null>`\n5. Optionally override:\n   - `beforeCachedClientConnect()` for tunnels or reachability preparation\n   - presentation through `descriptionOverride`, `tooltipOverride`, `iconPath`, or a justified `getTreeItem()` override\n6. Preserve the base context value. Add feature tags with `createContextValue([this.contextValue, ...extraTags])`; never replace it with a string that omits `treeItem_documentdbcluster`.\n7. Use `this.cluster.clusterId` for `CredentialCache` and `ClustersClient`, never `this.id`.\n\nRepresentative subclasses:\n\n- Stored connection: `src\u002Ftree\u002Fconnections-view\u002FDocumentDBClusterItem.ts`\n- Kubernetes discovery: `src\u002Fplugins\u002Fservice-kubernetes\u002Fdiscovery-tree\u002Fdocumentdb\u002FKubernetesResourceItem.ts`\n- Atlas discovery: `src\u002Fplugins\u002Fservice-atlas-mongodb\u002Fdiscovery-tree\u002FAtlasClusterItem.ts`\n- Managed synthetic cluster: `QuickStartClusterItem` in `src\u002Ftree\u002Fconnections-view\u002FLocalQuickStart\u002FLocalQuickStartItem.ts`\n\n## Dual Identity Contract\n\nA cluster has two IDs with different ownership:\n\n| ID          | Meaning                            | Stability                                      | Valid uses                                                                       |\n| ----------- | ---------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------- |\n| `clusterId` | Stable resource\u002Fcache identity     | Must survive tree moves and layout changes     | credentials, clients, sessions, serialized webview context, reverse lookup input |\n| `treeId`    | Current hierarchical tree position | May change with folders, parents, or view mode | `TreeElement.id`, child IDs, reveal\u002Fnavigation                                   |\n\nRules:\n\n- `clusterId` must not contain `\u002F`.\n- `treeId` must represent the node's actual rendered path.\n- `viewId` must identify the branch provider that owns the rendered node.\n- Child IDs derive from `treeId`, using helpers such as `buildDatabaseTreeId()` and `buildCollectionTreeId()`.\n- Never cache by `treeId` or `this.id`.\n- Never assume a stable ID is also a tree path unless the provider explicitly guarantees `clusterId === treeId`.\n- Never change tree construction without checking reverse lookup from `clusterId`.\n\n## Design Rendering and Lookup Together\n\nWhen adding a cluster hierarchy or a tree\u002Flist mode, specify these four functions before coding:\n\n1. **Stable identity:** How is `clusterId` built and made collision-safe?\n2. **Rendering:** How is `treeId` built in every layout?\n3. **Ownership:** Which branch provider receives `viewId` and `clusterId` later?\n4. **Reverse lookup:** How does that provider recover the current `treeId` and then the collection node?\n\nThe round trip must hold:\n\n```text\nrendered cluster\n  -> { clusterId, treeId, viewId }\n  -> open Collection View with { clusterId, viewId }\n  -> owning provider resolves current treeId\n  -> provider resolves \u003CtreeId>\u002F\u003Cdatabase>\u002F\u003Ccollection>\n```\n\n### Connections View\n\nPersisted connections use `clusterId = storageId`. Reconstruct the current folder path from storage with `buildFullTreePath()`; do not persist or guess an old `treeId`.\n\nSynthetic nodes are not in connection storage. Their feature must own:\n\n- an exact, side-effect-free ownership predicate\n- tree path builders used by rendering and reveal code\n- stable-ID-to-tree-ID resolution\n\nThe Connections provider may dispatch to that feature before falling back to persisted storage. Classify ownership **before invoking feature code**, so a feature resolver failure cannot break ordinary stored connections. See:\n\n- `src\u002Ftree\u002Fconnections-view\u002FresolveConnectionsClusterTreeId.ts`\n- `src\u002Ftree\u002Fconnections-view\u002FLocalQuickStart\u002FquickStartTreeIdentity.ts`\n\nDo not put feature-specific ID prefixes or synthetic paths into `buildFullTreePath()`.\n\n### Discovery View\n\n`clusterId` is provider-prefixed. The current `DiscoveryBranchDataProvider` removes that prefix and finds a cached tree node by its final suffix. Therefore every layout for that provider must end the cluster `treeId` with the same stable unprefixed suffix.\n\n- Preserve visible hierarchy in preceding path segments.\n- Use one helper to build the stable suffix for both `clusterId` and every tree layout.\n- Make the suffix collision-safe within the provider.\n- Test tree and list modes separately.\n- Do not rely on cluster display names alone when uniqueness is scoped by project, namespace, context, or source.\n\nThis suffix lookup is a current compatibility contract, not an ideal general identity mechanism. Issue #869 tracks exact stable-identity lookup. Until that changes, new Discovery providers must satisfy the suffix contract.\n\n### Azure Resources View\n\nDirect lookup is valid only where the provider intentionally guarantees `clusterId === treeId`. Document that invariant and test it.\n\n## Provider Responsibilities\n\nBranch providers must implement both when their clusters can open Collection View:\n\n- `findClusterNodeByClusterId(clusterId)`\n- `findCollectionByClusterId(clusterId, databaseName, collectionName)`\n\nPrefer one shared cluster-ID-to-tree-ID resolver so cluster and collection lookup cannot drift. Once the cluster node is known, use scoped child lookup to avoid expanding unrelated branches.\n\nDo not silently fall back between providers or storage zones unless identity ownership is explicit. An owned but currently unavailable synthetic cluster should return `undefined`, not masquerade as a persisted connection.\n\n## Required Tests for New Cluster Nodes or Layouts\n\nAdd focused tests before considering the feature complete.\n\n### 1. Base cluster behavior\n\n- The browsable item is a `ClusterItemBase` subclass.\n- Its context value retains `treeItem_documentdbcluster` plus feature tags.\n- `getCredentials()` is implemented for commands that need connection material.\n- Expansion returns database nodes and base failure paths return retry\u002Fopen-shell nodes as applicable.\n\nUse `src\u002Ftree\u002Fdocumentdb\u002FClusterItemBase.test.ts` as the base-behavior reference.\n\n### 2. Identity invariants\n\n- `clusterId` is stable and slash-free.\n- Moving folders or switching layout changes only `treeId`, not `clusterId`.\n- IDs remain unique where display names can repeat.\n- Cache operations use `clusterId`, not `treeId`.\n\nUse `src\u002Ftree\u002Fconnections-view\u002Fmodels\u002FConnectionClusterModel.test.ts` as a reference.\n\n### 3. Render-to-lookup round trip (mandatory)\n\nConstruct the cluster through the **real parent\u002Froot item**, not only as a model fixture, then assert:\n\n```typescript\nexpect(rendered.cluster.clusterId).toBe(expectedStableId);\nexpect(rendered.cluster.treeId).toBe(expectedTreePath);\nexpect(await provider.findClusterNodeByClusterId(rendered.cluster.clusterId)).toBe(rendered);\nexpect(await provider.findCollectionByClusterId(rendered.cluster.clusterId, databaseName, collectionName)).toBe(\n  expectedCollection,\n);\n```\n\nThis test must exist for every materially different layout: root\u002Ffolder, tree\u002Flist, or other synthetic hierarchy. It would have caught both the Atlas suffix mismatch and the Quick Start storage-path mismatch.\n\n### 4. Ownership isolation for synthetic nodes\n\n- Exact owned ID uses the feature resolver.\n- Ordinary IDs never invoke the feature resolver.\n- Owned-but-unavailable IDs do not fall through to persisted lookup.\n- A feature resolver failure cannot affect ordinary persisted lookup.\n\nUse `src\u002Ftree\u002Fconnections-view\u002FresolveConnectionsClusterTreeId.test.ts` as a reference.\n\n### 5. Command compatibility\n\nAt minimum, verify the context contract and `getCredentials()` path needed by:\n\n- Copy Connection String\n- Open Shell\n- Save\u002FAdd to Connections when enabled\n\nIf a command is intentionally unavailable, gate it explicitly with context values and document why; do not omit base behavior accidentally.\n\n## Failure Presentation: Actions Only\n\nThe tree shows **actions, never error or information rows**. When expanding a cluster fails, the\nreason goes in a **modal** (`showErrorMessage(..., { modal: true, detail })`, translated through\n`ErrorExplanationService` where available). The children are only recovery actions: Retry,\n\"Diagnose this connection…\", \"Click here to open the shell\" (on every failure, so experts can debug\nin the shell even when connecting or sign-in failed), and provider-owned\nactions such as \"Update credentials…\" via `errorRecoveryActions`\n(`ClusterItemBase.createErrorRecoveryChildren`).\n\nDo not add a child whose purpose is to show a message (an error label, a \"sign-in required\" row,\na tooltip-only info node), even with an icon. Better wording belongs in the modal and in the\nDiagnose connection panel, not in the tree.\n\n## Review Checklist\n\nBefore approving a cluster tree change, answer yes to all:\n\n- [ ] Browsable cluster extends `ClusterItemBase`.\n- [ ] Base cluster context tag is preserved.\n- [ ] `clusterId`, `treeId`, and `viewId` have documented owners.\n- [ ] Credentials and clients use `clusterId` only.\n- [ ] Every rendered layout has a reverse lookup strategy.\n- [ ] Cluster and collection lookup share one resolver.\n- [ ] Synthetic ownership is exact and isolated from stored lookup.\n- [ ] IDs are collision-safe beyond display names.\n- [ ] A real render-to-lookup round-trip test covers every layout.\n- [ ] Standard cluster commands work or are explicitly gated off.\n- [ ] Failures show a modal; tree children are recovery actions only, never error or info rows.\n",{"name":5,"description":7},"main","a2ea119b85b92857e68374e35a300362ab5f44c3",".github\u002Fskills\u002Ftree-cluster-architecture",23,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-11 06:07:34",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add microsoft\u002Fvscode-documentdb --skill tree-cluster-architecture",{"tool":61,"command":62},"bunx","bunx skills add microsoft\u002Fvscode-documentdb --skill tree-cluster-architecture",{"tool":64,"command":65},"pnpm","pnpm dlx skills add microsoft\u002Fvscode-documentdb --skill tree-cluster-architecture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ftree-cluster-architecture\u002FSKILL.md",true,[],[70,109,133,165,184,204],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":86,"publishedAt":41},"01M69BSZH60F9JW3N87ZBSKTW8","writing-release-notes","Generates release notes and changelog entries for the DocumentDB extension for Visual Studio Code, and announces releases on GitHub Discussions. Use when preparing version releases, creating patch update notes, writing changelog entries, documenting new features and fixes, or posting a release or patch release announcement to Discussions. Handles both major\u002Fminor versions (new file) and patch updates (append to existing file).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwriting-release-notes\u002FSKILL.md",[76,81],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,34,108],"writing","notes","release notes","release","writing release notes","github","visual studio code","visual studio","update","code","changelog","announcement","release announcement","append","patch","releases","posting","studio","updates","fixes","features","new",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":41},"01M69BSXPVQWSQVYNT6QK38VN1","webview-trpc-messaging","Implements tRPC-based communication between VS Code extension host and React webviews. Use when creating new webview procedures (queries, mutations, subscriptions), adding a new webview router, wiring up a webview controller, using the tRPC client from React components, applying telemetry middleware (telemetryMiddlewareBody), or supporting AbortSignal-based cancellation in webview operations.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fwebview-trpc-messaging\u002FSKILL.md",[],[116,117,118,119,120,121,122,96,123,124,125,126,127,128,129,130,131,132,34,108],"webview trpc messaging","messaging","trpc","components","react","react components","telemetry","communication","controller","use","router","up","queries","mutations","host","middleware","wiring",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":145,"publishedAt":41},"01M69BSV4V52VBDF3RZ3E6Y61T","ux-pr-review","Prepare and run an agent-assisted UX \u002F workflow review of a pull request. Use when the operator says \"I'm about to work on a UX PR review, please prepare\", \"prepare a UX review for PR","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fux-pr-review\u002FSKILL.md",[139,142],{"categoryNo":140,"categoryName":141,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":143,"categoryName":144,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000032","设计师",[146,147,148,149,150,151,152,153,154,155,156,157,158,159,125,160,161,162,163,164,34],"review","pr review","pr","ux pr review","ux","workflow","prepare","pull request","run","pull","operator","work on","work","ux review","workflow review","please","about","for","request",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":41},"01M69BSPMFSH3FAR4R5TGDB468","telemetry-instrumentation","Instrumentation patterns for telemetry in the vscode-documentdb extension. Use when adding telemetry to a feature, enriching existing telemetry with properties or measurements, linking related events with correlation IDs, instrumenting commands or tree views, suppressing noisy events, or deciding what data points to capture. Also use when asked to \"add telemetry\" or \"improve telemetry\" for any feature.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Ftelemetry-instrumentation\u002FSKILL.md",[],[122,172,173,38,28,174,175,125,176,26,177,178,179,180,181,21,163,182,183,34],"telemetry instrumentation","instrumentation","ids","improve","properties","commands","feature","events","add","with","linking","Existing",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":191,"publishedAt":41},"01M69BSMRAT64W6F3F15FVQ9QK","skill-creator","Guide for creating effective GitHub Copilot skills (.github\u002Fskills\u002F) in this repository. Use when creating a new skill, updating an existing skill, or when asked about skill structure, format, or best practices for the vscode-documentdb project.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fskill-creator\u002FSKILL.md",[190],{"categoryNo":140,"categoryName":141,"taxonomyType":79,"taxonomyTypeDesc":80},[192,193,92,38,194,195,196,197,198,125,199,200,201,202,162,203,163,183,34,108],"skill creator","creator","github copilot","copilot","best practices","repository","format","new skill","structure","project","copilot skills","github copilot skills",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":210,"publishedAt":41},"01M69BSJZA3VPPP4XMY7G2QA6V","review-external-pr","Triage an external contributor's PR and prepare it for merge. Detects push permission, base branch, draft state, size, and history quality, then picks one of three paths (review-only, direct push to contributor branch, or a `reviews\u002F` staging branch). Use when triaging or reviewing a community PR, deciding whether maintainer changes are needed, choosing a merge strategy (squash\u002Fmerge\u002Frebase), or merging an external contribution.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-documentdb\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Freview-external-pr\u002FSKILL.md",[],[146,148,211,212,213,152,214,215,216,217,218,219,220,221,222,223,224,225,226,163,227,34],"review external pr","triage","merge","push","rebase","squash","direct","history","branch","strategy","only","community","three","permission","paths","reviews","contributor"]