param( [switch]$all, # do all [switch]$a, # shortcut for all [switch]$c, # copy to clipboard [switch]$t, # file tree [switch]$m, # file metadata [string[]]$ExcludeExtensions = @(), [string[]]$ExcludePaths = @() ) if ($all -or $a) { $c = $true $t = $true $m = $true $a = $true $all = $true } # base configuration $codeExtensions = @("*.cs", "*.js", "*.jsx", "*.vue", "*.ts", "*.py", "*.html", "*.css", "*.cpp", "*.h", "*.java", "*.rb", "*.go", "*.rs", "*.sh", "*.ps1", "*.php", "*.xml") $baseDir = Get-Location # excluded directory names $excludedDirs = @("__pycache__", "node_modules", "bin", "obj", "dist", "build", ".git", ".svn", ".pio", ".vscode", "venv", ".typed") # initialize exclude extensions set $excludeExtensionsHashSet = [System.Collections.Generic.HashSet[string]]::new() $ExcludeExtensions | ForEach-Object { $excludeExtensionsHashSet.Add($_) } # initialize output string $output = "" # function to get filtered files function Get-FilteredFiles { return Get-ChildItem -Path $baseDir -Recurse -Include $codeExtensions | Where-Object { ($excludeExtensionsHashSet.Contains($_.Extension) -eq $false) -and ($ExcludePaths -notcontains $_.DirectoryName) -and (-not ($_.FullName -match "($($excludedDirs -join '|'))")) } } # function to generate file tree function Get-FileTree { $tree = "### File Tree ###`n`n" $fileTreeEntries = Get-ChildItem -Path $baseDir -Recurse foreach ($entry in $fileTreeEntries) { if (-not ($entry.FullName -match "($($excludedDirs -join '|'))")) { $relativePath = $entry.FullName.Substring($baseDir.Length + 1) $tree += if ($entry.PSIsContainer) { "[Dir] $relativePath`n" } else { "[File] $relativePath`n" } } } return $tree } # function to get file metadata function Get-FileMetadata { param($file) $relativePath = $file.FullName.Substring($baseDir.Length + 1) $metadata = "Path: $relativePath`n" $metadata += "Size: $([math]::Round($file.Length / 1KB, 2)) KB`n" $metadata += "Last Modified: $($file.LastWriteTime)`n" return $metadata } # function to get file content function Get-FileContentWithHeader { param($file) $relativePath = $file.FullName.Substring($baseDir.Length + 1) $content = Get-Content $file.FullName -Raw return $content } # handle file content and metadata if ($m) { $files = Get-FilteredFiles foreach ($file in $files) { $output += "### File Metadata ###`n" $output += Get-FileMetadata $file if ($all) { $output += "`n### File Content ###`n" $output += Get-FileContentWithHeader $file } $output += ("-" * 80) + "`n`n" } } # handle tree output at the end if ($t) { $output += Get-FileTree # $output += ("-" * 80) + "`n" } # output the result $output # copy to clipboard if requested if ($c) { $output | Set-Clipboard Write-Host "Content copied to clipboard." }