Files
admin b723e2bd7d 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>
2026-01-23 18:05:17 +00:00

88 lines
2.5 KiB
TypeScript

/**
* 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 }