|
@@ -1,3 +1,4 @@
|
|
|
|
|
+import * as path from 'path';
|
|
|
import * as vscode from 'vscode';
|
|
import * as vscode from 'vscode';
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -89,6 +90,17 @@ export async function copyWorkspaceFiles(): Promise<void> {
|
|
|
await copyFilesFromUris(uris);
|
|
await copyFilesFromUris(uris);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Copy a single folder path to clipboard with AI-friendly formatting.
|
|
|
|
|
+ * Output: [src/utils]
|
|
|
|
|
+ */
|
|
|
|
|
+export async function copyFolderPath(folderUri: vscode.Uri): Promise<void> {
|
|
|
|
|
+ const folderPath = vscode.workspace.asRelativePath(folderUri);
|
|
|
|
|
+ const result = `[${folderPath}]`;
|
|
|
|
|
+ await vscode.env.clipboard.writeText(result);
|
|
|
|
|
+ showStatus(`$(clippy) Copied folder: ${folderPath}`);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Copy files selected in the explorer context menu.
|
|
* Copy files selected in the explorer context menu.
|
|
|
*/
|
|
*/
|
|
@@ -97,13 +109,58 @@ export async function copySelectedFiles(selectedUris: vscode.Uri[]): Promise<voi
|
|
|
await copyFilesFromUris(selectedUris);
|
|
await copyFilesFromUris(selectedUris);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Recursively collect all file URIs under a directory.
|
|
|
|
|
+ */
|
|
|
|
|
+async function collectFilesRecursively(dirUri: vscode.Uri): Promise<vscode.Uri[]> {
|
|
|
|
|
+ const result: vscode.Uri[] = [];
|
|
|
|
|
+ const entries = await vscode.workspace.fs.readDirectory(dirUri);
|
|
|
|
|
+
|
|
|
|
|
+ for (const [name, type] of entries) {
|
|
|
|
|
+ const childUri = vscode.Uri.joinPath(dirUri, name);
|
|
|
|
|
+ if (type === vscode.FileType.Directory) {
|
|
|
|
|
+ const children = await collectFilesRecursively(childUri);
|
|
|
|
|
+ result.push(...children);
|
|
|
|
|
+ } else if (type === vscode.FileType.File) {
|
|
|
|
|
+ result.push(childUri);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Expand a mixed list of file/directory URIs into a flat list of file URIs.
|
|
|
|
|
+ */
|
|
|
|
|
+async function expandUris(uris: vscode.Uri[]): Promise<vscode.Uri[]> {
|
|
|
|
|
+ const result: vscode.Uri[] = [];
|
|
|
|
|
+
|
|
|
|
|
+ for (const uri of uris) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const stat = await vscode.workspace.fs.stat(uri);
|
|
|
|
|
+ if (stat.type === vscode.FileType.Directory) {
|
|
|
|
|
+ const children = await collectFilesRecursively(uri);
|
|
|
|
|
+ result.push(...children);
|
|
|
|
|
+ } else if (stat.type === vscode.FileType.File) {
|
|
|
|
|
+ result.push(uri);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ // skip inaccessible paths
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Read and format multiple files, then copy to clipboard.
|
|
* Read and format multiple files, then copy to clipboard.
|
|
|
*/
|
|
*/
|
|
|
async function copyFilesFromUris(uris: vscode.Uri[]): Promise<void> {
|
|
async function copyFilesFromUris(uris: vscode.Uri[]): Promise<void> {
|
|
|
|
|
+ const fileUris = await expandUris(uris);
|
|
|
|
|
+
|
|
|
const entries: { filePath: string }[] = [];
|
|
const entries: { filePath: string }[] = [];
|
|
|
|
|
|
|
|
- for (const uri of uris) {
|
|
|
|
|
|
|
+ for (const uri of fileUris) {
|
|
|
try {
|
|
try {
|
|
|
await vscode.workspace.openTextDocument(uri);
|
|
await vscode.workspace.openTextDocument(uri);
|
|
|
const filePath = vscode.workspace.asRelativePath(uri);
|
|
const filePath = vscode.workspace.asRelativePath(uri);
|