Reorganize: Move all skills to skills/ folder
- Created skills/ directory - Moved 272 skills to skills/ subfolder - Kept agents/ at root level - Kept installation scripts and docs at root level Repository structure: - skills/ - All 272 skills from skills.sh - agents/ - Agent definitions - *.sh, *.ps1 - Installation scripts - README.md, etc. - Documentation Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* Branch Cleanup Command
|
||||
* Removes merged branches locally and remotely
|
||||
*/
|
||||
|
||||
import { exec } from 'child_process'
|
||||
import { promisify } from 'util'
|
||||
|
||||
const execAsync = promisify(exec)
|
||||
|
||||
export interface BranchCleanupOptions {
|
||||
local?: boolean
|
||||
remote?: boolean
|
||||
exclude?: string[]
|
||||
dryRun?: boolean
|
||||
}
|
||||
|
||||
export async function handle(
|
||||
args: BranchCleanupOptions,
|
||||
context: any
|
||||
): Promise<string> {
|
||||
const { local = true, remote = true, exclude = ['main', 'master', 'develop'], dryRun = false } = args
|
||||
|
||||
const results: string[] = []
|
||||
|
||||
try {
|
||||
// Get current branch
|
||||
const { stdout: currentBranch } = await execAsync('git rev-parse --abbrev-ref HEAD')
|
||||
|
||||
if (local) {
|
||||
// Get merged local branches
|
||||
const { stdout: mergedBranches } = await execAsync('git branch --merged')
|
||||
|
||||
const branchesToDelete = mergedBranches
|
||||
.split('\n')
|
||||
.map((b) => b.trim().replace('*', '').trim())
|
||||
.filter(
|
||||
(branch) =>
|
||||
branch &&
|
||||
branch !== currentBranch.trim() &&
|
||||
!exclude.includes(branch)
|
||||
)
|
||||
|
||||
if (branchesToDelete.length > 0) {
|
||||
if (dryRun) {
|
||||
results.push(`Would delete local branches: ${branchesToDelete.join(', ')}`)
|
||||
} else {
|
||||
for (const branch of branchesToDelete) {
|
||||
await execAsync(`git branch -d ${branch}`)
|
||||
results.push(`✓ Deleted local branch: ${branch}`)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
results.push('No local branches to clean up')
|
||||
}
|
||||
}
|
||||
|
||||
if (remote) {
|
||||
// Get merged remote branches
|
||||
const { stdout: remoteBranches } = await execAsync('git branch -r --merged')
|
||||
|
||||
const branchesToDelete = remoteBranches
|
||||
.split('\n')
|
||||
.map((b) => b.trim().replace('origin/', '').trim())
|
||||
.filter((branch) => branch && branch !== 'HEAD' && !exclude.includes(branch))
|
||||
|
||||
if (branchesToDelete.length > 0) {
|
||||
if (dryRun) {
|
||||
results.push(`Would delete remote branches: ${branchesToDelete.join(', ')}`)
|
||||
} else {
|
||||
for (const branch of branchesToDelete) {
|
||||
await execAsync(`git push origin --delete ${branch}`)
|
||||
results.push(`✓ Deleted remote branch: ${branch}`)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
results.push('No remote branches to clean up')
|
||||
}
|
||||
}
|
||||
|
||||
return results.join('\n')
|
||||
} catch (error: any) {
|
||||
throw new Error(`Branch cleanup failed: ${error.message}`)
|
||||
}
|
||||
}
|
||||
|
||||
export default { handle }
|
||||
Reference in New Issue
Block a user