Synthèse automatique
Guide l'implémentation du module codeXray, qui parcourt l'arborescence d'un projet, l'analyse répertoire par répertoire avec le modèle Copilot et produit une documentation Markdown ainsi que des commentaires de code au sein d'une extension VS Code.
Points forts
- Fournit un code TypeScript prêt à l'emploi pour le scan récursif de répertoires, avec profondeur maximale et motifs d'exclusion.
- Montre concrètement l'intégration de l'API vscode.lm / Copilot et la collecte d'une réponse en streaming.
- Décrit une stratégie d'analyse hiérarchique ascendante avec gestion du contexte pour limiter la taille des prompts.
- Propose une structure de répertoires claire séparant commands, services et utils.
Limites
- Plusieurs volets (intégration Copilot, analyse hiérarchique, gestion du contexte) sont annoncés comme planifiés et le dernier extrait de code est tronqué.
- Fortement lié aux API d'extension VS Code, donc peu réutilisable en dehors de cet environnement.
- Peu de gestion d'erreurs, aucun test ni estimation de coût en tokens au-delà de la mention du contrôle de contexte.
À utiliser lorsqu'il faut construire ou étendre la fonctionnalité codeXray d'analyse de projet et de génération de documentation dans l'extension VS Code AI Omni.
À éviter si l'on cherche un outil d'analyse de code autonome, sans lien avec VS Code ni avec le module codeXray.
Analyse de sécurité
SûrThe skill contains no executable instructions; it is a development guide with code snippets for a VS Code extension. The code uses only local file scanning via vscode.workspace.fs and Copilot language model APIs. No destructive commands, network exfiltration, obfuscation, or unsafe practices are present.
Aucun point d'attention détecté
Comment cette analyse est faiteExemples
Implement the recursive file scanner for codeXray in extension/services/fileScanner.ts, with maxDepth defaulting to 10 and exclusions for node_modules, .git, dist, .vscode and *.log.Add the Copilot integration to extension/services/projectAnalyzer.ts using vscode.lm.selectChatModels with vendor 'copilot' and family 'gpt-4o', and collect the streamed response into a single string.Write the hierarchical analysis flow for codeXray: analyze all leaf directories first, roll their summaries up to parent directories, then generate the overall project overview Markdown.name: codexray description: codeXray 功能开发模块。当需要实现项目分析、文档生成、代码注释、AI 工作流、Copilot API 集成时使用。涵盖文件遍历、分层分析、上下文管理、文档输出等核心功能。
codeXray 功能开发
codeXray 是 AI Omni 的核心功能模块,实现 AI 驱动的项目分析和文档生成。
功能概述
基于 prd/codeXray/brief.md 的需求:
- 项目遍历:递归扫描目录,构建文件树
- 分层理解:以目录为单位进行 AI 分析
- 文档生成:生成项目概述 Markdown
- 代码注释:为文件添加行级注释
目录结构 (规划)
extension/
├─ commands/
│ └─ analyzeProject.ts # 分析项目命令
├─ services/
│ ├─ fileScanner.ts # 文件扫描服务
│ ├─ projectAnalyzer.ts # 项目分析服务
│ ├─ documentGenerator.ts # 文档生成服务
│ └─ codeAnnotator.ts # 代码注释服务
└─ utils/
├─ fileTree.ts # 文件树工具
└─ contextManager.ts # 上下文管理
Instructions
1. 实现文件扫描服务
// extension/services/fileScanner.ts
import * as vscode from 'vscode';
import * as path from 'path';
export interface FileInfo {
path: string;
relativePath: string;
type: 'file' | 'directory';
name: string;
extension?: string;
children?: FileInfo[];
}
export interface ScanOptions {
maxDepth?: number;
excludePatterns?: string[];
}
const DEFAULT_EXCLUDES = [
'node_modules',
'.git',
'dist',
'.vscode',
'*.log'
];
export async function scanDirectory(
rootPath: string,
options: ScanOptions = {}
): Promise<FileInfo> {
const { maxDepth = 10, excludePatterns = DEFAULT_EXCLUDES } = options;
async function scan(dirPath: string, depth: number): Promise<FileInfo> {
const name = path.basename(dirPath);
const relativePath = path.relative(rootPath, dirPath);
const info: FileInfo = {
path: dirPath,
relativePath: relativePath || '.',
type: 'directory',
name,
children: []
};
if (depth >= maxDepth) return info;
const entries = await vscode.workspace.fs.readDirectory(
vscode.Uri.file(dirPath)
);
for (const [entryName, entryType] of entries) {
// 检查排除模式
if (shouldExclude(entryName, excludePatterns)) continue;
const entryPath = path.join(dirPath, entryName);
if (entryType === vscode.FileType.Directory) {
info.children!.push(await scan(entryPath, depth + 1));
} else if (entryType === vscode.FileType.File) {
info.children!.push({
path: entryPath,
relativePath: path.relative(rootPath, entryPath),
type: 'file',
name: entryName,
extension: path.extname(entryName)
});
}
}
return info;
}
return scan(rootPath, 0);
}
function shouldExclude(name: string, patterns: string[]): boolean {
return patterns.some(pattern => {
if (pattern.startsWith('*')) {
return name.endsWith(pattern.slice(1));
}
return name === pattern;
});
}
2. 集成 Copilot API (计划)
// extension/services/projectAnalyzer.ts
import * as vscode from 'vscode';
export async function analyzeWithCopilot(
content: string,
prompt: string
): Promise<string> {
// 获取 Copilot Language Model
const models = await vscode.lm.selectChatModels({
vendor: 'copilot',
family: 'gpt-4o'
});
if (models.length === 0) {
throw new Error('Copilot model not available');
}
const model = models[0];
// 构建消息
const messages = [
vscode.LanguageModelChatMessage.User(prompt + '\n\n' + content)
];
// 发送请求
const response = await model.sendRequest(messages, {});
// 收集流式响应
let result = '';
for await (const chunk of response.text) {
result += chunk;
}
return result;
}
3. 分层分析策略
// 自底向上分析
async function analyzeProjectHierarchy(root: FileInfo): Promise<void> {
// 1. 先分析所有叶子目录
const leafDirs = findLeafDirectories(root);
for (const dir of leafDirs) {
dir.summary = await analyzeDirectory(dir);
}
// 2. 向上汇总到父目录
await rollupToParent(root);
// 3. 生成整体文档
const overview = await generateOverview(root);
}
// 上下文控制:每次只发送当前层 + 子层摘要
function buildPromptForDirectory(dir: FileInfo): string {
const childSummaries = dir.children
?.filter(c => c.type === 'directory')
.map(c => `- ${c.name}: ${c.summary}`)
.join('\n');
const files = dir.children
?.filter(c => c.type === 'file')
.map(c => `- ${c.name}`)
.join('\n');
return `
分析目录: ${dir.name}
子目录摘要:
${childSummaries || '无'}
包含文件:
${files || '无'}
请总结此目录的职责和主要功能。
`.trim();
}
4. 注册命令
// extension/commands/analyzeProject.ts
import * as vscode from 'vscode';
import { scanDirectory } from '../services/fileScanner';
export async function analyzeProject(context: vscode.ExtensionContext) {
// 1. 让用户选择目录
const folders = await vscode.window.showOpenDialog({
canSelectFolders: true,
canSelectFiles: false,
canSelectMany: false,
title: 'Select Project to Analyze'
});
if (!folders || folders.length === 0) return;
const rootPath = folders[0].fsPath;
// 2. 显示进度
await vscode.window.withProgress({
location: vscode.ProgressLocation.Notification,
title: 'Analyzing project...',
cancellable: true
}, async (progress, token) => {
// 3. 扫描目录
progress.report({ message: 'Scanning files...' });
const fileTree = await scanDirectory(rootPath);
if (token.isCancellationRequested) return;
// 4. AI 分析 (待实现)
progress.report({ message: 'Analyzing with AI...' });
// await analyzeProjectHierarchy(fileTree);
// 5. 生成文档 (待实现)
progress.report({ message: 'Generating documentation...' });
// await generateDocumentation(fileTree, rootPath);
vscode.window.showInformationMessage('Project analysis complete!');
});
}
配置项
在 package.json 添加:
{
"contributes": {
"configuration": {
"title": "AI Omni - codeXray",
"properties": {
"aiOmni.codeXray.commentLanguage": {
"type": "string",
"default": "chinese",
"enum": ["chinese", "english"],
"description": "Language for generated comments"
},
"aiOmni.codeXray.maxDepth": {
"type": "number",
"default": 10,
"description": "Maximum directory depth to scan"
},
"aiOmni.codeXray.outputPath": {
"type": "string",
"default": "",
"description": "Path to save generated documentation"
}
}
}
}
}
实施阶段
| 阶段 | 任务 | 状态 | |------|------|------| | 1 | 文件遍历和文件树构建 | 🔲 待开发 | | 2 | Copilot API 集成和分层分析 | 🔲 待开发 | | 3 | 文档生成和 UI 预览 | 🔲 待开发 | | 4 | 代码注释功能 | 🔲 待开发 | | 5 | 测试和优化 | 🔲 待开发 |
参考资料
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/codexray-project-analysis-module-mryiqho8' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/codexray-project-analysis-module-mryiqho8/download' --output '.skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md.part' && mv '.skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md.part' '.skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.
Claude Code
test -f '.skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md' && test -s '.skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/codexray' && cp -R '.skill-downloads/codexray-project-analysis-module-mryiqho8' '.claude/skills/codexray'OpenSkills
OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.
Installation officielle d’OpenSkillsopenskills install './.skill-downloads/codexray-project-analysis-module-mryiqho8'openskills read 'codexray-project-analysis-module-mryiqho8'La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.
Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.
openskills syncMode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/codexray-project-analysis-module-mryiqho8/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.