return undefined;
}
const discoveryInfo = await this.cachedSkills.get(token);
const result = this.skillsFromDiscoveryInfo(discoveryInfo);
return result;
}
Frontier kind: Code frontier
unlabeled · c_de9a25126b07
25 tests · 67649 LOC · 326 files · introduces 0 tests · 112 LOC · 1 file
The orange circle is the focus. Violet and green circles are every ancestor and descendant, broader and narrower, at any distance; blue squares and pink diamonds are the introduced files and exact introduced tests of every visible concept, not only the focus's. Arrows point from broader to narrower concepts and bridge only concepts omitted from this view. Undirected links show source or test introduction. Concept and file size follows LOC; exact test nodes use test-count units.
Introduced files, introduced tests, and structurally relevant concept specialization
In the embedded map, ordinary wheel input scrolls the page; use the visible controls to zoom and drag to pan. Open the full-screen map for canvas navigation: wheel pans, Ctrl/Command plus wheel zooms, and arrow keys pan when this region is focused. On touch screens, open the full-screen map to pan or pinch. If JavaScript or WebGL is unavailable, use the native relationship evidence on this page.
Graph controls are ready.
Interactive rendering requires JavaScript and WebGL. Use the native relationship evidence on this page while the interactive map is unavailable.
Every exact file and test below is linked only from the concept that introduces it.
mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/workbench/contrib/chat/test/common/promptSyntax/computeAutomaticInstructions.test|title=ComputeAutomaticInstructions instructions list variable should generate instructions list when readFile tool available|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/workbench/contrib/chat/test/common/promptSyntax/computeAutomaticInstructions.test|title=ComputeAutomaticInstructions instructions list variable should generate instructions list when readFile tool unavailable and runInTerminal tool available|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/workbench/contrib/chat/test/common/promptSyntax/service/promptsService.test|title=PromptsService findAgentSkills should prioritize skills by source: workspace > user > extension|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/workbench/contrib/chat/test/common/promptSyntax/service/promptsService.test|title=PromptsService findAgentSkills should skip duplicate skill names and keep first by priority|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/platform/instantiation/test/common/instantiationService.test|title=Instantiation Service @Param - fixed args|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/platform/instantiation/test/common/instantiationService.test|title=Instantiation Service @Param - simple clase|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/lifecycle.test|title=Lifecycle Action bar has broken accessibility #100273|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/lifecycle.test|title=Lifecycle dispose disposable array|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/uri.test|title=URI URI#file, always slash|occurrence=1mocha:v1|namespace=vscode@05c208e9e28d8c1c723fa08f85e2b7a96092e8e5|file=vs/base/test/common/uri.test|title=URI class URI cannot represent relative file paths #34449|occurrence=1Every collected test enters the hierarchy at exactly one concept.
No tests are introduced at this concept. Its intent tests are introduced by other concepts.
Every collected source range enters the hierarchy at exactly one concept.
1 file ranked by introduced lines: 112 introduced LOC across 8 ranges. Expand a file to inspect source; the > gutter marks introduced lines.
return undefined;
}
const discoveryInfo = await this.cachedSkills.get(token);
const result = this.skillsFromDiscoveryInfo(discoveryInfo);
return result;
}
*/
private skillsFromDiscoveryInfo(discoveryInfo: IPromptDiscoveryInfo): IAgentSkill[] {
for (const file of discoveryInfo.files) {
if (file.status === 'loaded' && file.promptPath.name) {
const sanitizedDescription = this.truncateAgentSkillDescription(file.promptPath.description, file.promptPath.uri);
*/
private async computeSkillDiscovery(token: CancellationToken): Promise<IPromptDiscoveryInfo> {
const files = await this.computeSkillDiscoveryInfo(token);
const sourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.skill);
// Count by source for telemetry
const skillsBySource = new Map<PromptFileSource, number>();
for (const file of files) {
if (file.status === 'loaded' && file.promptPath.name) {
const source = file.promptPath.source;
}
}
// Count skip reasons for telemetry
let skippedMissingName = 0;
let skippedMissingDescription = 0;
let skippedDuplicateName = 0;
let skippedParseFailed = 0;
let skippedNameMismatch = 0;
for (const file of files) {
if (file.status === 'skipped') {
switch (file.skipReason) {
}
}
// Send telemetry about skill usage
type AgentSkillsFoundEvent = {
totalSkillsFound: number;
claudePersonal: number;
claudeWorkspace: number;
copilotPersonal: number;
githubWorkspace: number;
agentsPersonal: number;
agentsWorkspace: number;
configPersonal: number;
configWorkspace: number;
extensionContribution: number;
extensionAPI: number;
plugin: number;
skippedDuplicateName: number;
skippedMissingName: number;
skippedMissingDescription: number;
skippedNameMismatch: number;
skippedParseFailed: number;
};
type AgentSkillsFoundClassification = {
totalSkillsFound: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Total number of agent skills found.' };
claudePersonal: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of Claude personal skills.' };
claudeWorkspace: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of Claude workspace skills.' };
copilotPersonal: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of Copilot personal skills.' };
githubWorkspace: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of GitHub workspace skills.' };
agentsPersonal: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of .agents personal skills.' };
agentsWorkspace: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of .agents workspace skills.' };
configPersonal: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of custom configured personal skills.' };
configWorkspace: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of custom configured workspace skills.' };
extensionContribution: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of extension contributed skills.' };
extensionAPI: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of extension API provided skills.' };
plugin: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of plugin provided skills.' };
skippedDuplicateName: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of skills skipped due to duplicate names.' };
skippedMissingName: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of skills skipped due to missing name attribute.' };
skippedMissingDescription: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of skills skipped due to missing description attribute.' };
skippedNameMismatch: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of skills skipped due to name not matching folder name.' };
skippedParseFailed: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; isMeasurement: true; comment: 'Number of skills skipped due to parse failures.' };
owner: 'pwang347';
comment: 'Tracks agent skill usage, discovery, and skipped files.';
};
const totalSkillsFound = files.filter(f => f.status === 'loaded' && f.promptPath.name).length;
this.telemetryService.publicLog2<AgentSkillsFoundEvent, AgentSkillsFoundClassification>('agentSkillsFound', {
totalSkillsFound,
claudePersonal: skillsBySource.get(PromptFileSource.ClaudePersonal) ?? 0,
claudeWorkspace: skillsBySource.get(PromptFileSource.ClaudeWorkspace) ?? 0,
copilotPersonal: skillsBySource.get(PromptFileSource.CopilotPersonal) ?? 0,
githubWorkspace: skillsBySource.get(PromptFileSource.GitHubWorkspace) ?? 0,
agentsPersonal: skillsBySource.get(PromptFileSource.AgentsPersonal) ?? 0,
agentsWorkspace: skillsBySource.get(PromptFileSource.AgentsWorkspace) ?? 0,
configWorkspace: skillsBySource.get(PromptFileSource.ConfigWorkspace) ?? 0,
configPersonal: skillsBySource.get(PromptFileSource.ConfigPersonal) ?? 0,
extensionContribution: skillsBySource.get(PromptFileSource.ExtensionContribution) ?? 0,
extensionAPI: skillsBySource.get(PromptFileSource.ExtensionAPI) ?? 0,
plugin: skillsBySource.get(PromptFileSource.Plugin) ?? 0,
skippedDuplicateName,
skippedMissingName,
skippedMissingDescription,
skippedNameMismatch,
skippedParseFailed
});
return { type: PromptsType.skill, files, sourceFolders, durationInMillis: stopWatch.elapsed() };
}
public async getHooks(token: CancellationToken): Promise<IConfiguredHooksInfo | undefined> {
*/
private async computeSkillDiscoveryInfo(token: CancellationToken): Promise<IPromptFileDiscoveryResult[]> {
const seenNames = new Set<string>();
const nameToUri = new Map<string, URI>();
// Collect all skills with their metadata for sorting
const allSkills: Array<IPromptPath> = [];
const skills = await Promise.all([
this.fileLocator.findAgentSkills(token),
this.getExtensionPromptFiles(PromptsType.skill, token),
Promise.resolve(this._pluginPromptFilesByType.get(PromptsType.skill) ?? []),
this.getBuiltinPromptFiles(PromptsType.skill, token)
]);
for (const skillList of skills) {
allSkills.push(...skillList);
}
// Stable sort; we should keep order consistent to the order in the user's configuration object
allSkills.sort((a, b) => this.getSkillPriority(a) - this.getSkillPriority(b));
for (const skill of allSkills) {
const uri = skill.uri;
const promptPath = skill;
}
}
return files;
}
private async getInstructionsDiscoveryInfo(token: CancellationToken): Promise<IInstructionDiscoveryInfo> {