aidevops 2.52.1 → 2.53.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/VERSION +1 -1
- package/aidevops.sh +15 -9
- package/package.json +4 -4
- package/scripts/npm-postinstall.js +6 -7
- package/setup.sh +1 -1
- package/templates/deploy-templates.sh +144 -0
- package/templates/home/.agent/README.md +33 -0
- package/templates/home/AGENTS.md +96 -0
- package/templates/home/git/.agent/README.md +48 -0
- package/templates/home/git/AGENTS.md +97 -0
- package/templates/standard-functions.sh +179 -0
- package/templates/wordpress-performance-workflow.md +217 -0
- package/.agent/AGENTS.md +0 -614
- package/.agent/accounts.md +0 -65
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +0 -456
- package/.agent/aidevops/api-integrations.md +0 -335
- package/.agent/aidevops/architecture.md +0 -510
- package/.agent/aidevops/configs.md +0 -274
- package/.agent/aidevops/docs.md +0 -244
- package/.agent/aidevops/extension.md +0 -311
- package/.agent/aidevops/mcp-integrations.md +0 -340
- package/.agent/aidevops/mcp-troubleshooting.md +0 -162
- package/.agent/aidevops/memory-patterns.md +0 -172
- package/.agent/aidevops/providers.md +0 -217
- package/.agent/aidevops/recommendations.md +0 -321
- package/.agent/aidevops/requirements.md +0 -301
- package/.agent/aidevops/resources.md +0 -214
- package/.agent/aidevops/security-requirements.md +0 -174
- package/.agent/aidevops/security.md +0 -350
- package/.agent/aidevops/service-links.md +0 -400
- package/.agent/aidevops/services.md +0 -357
- package/.agent/aidevops/setup.md +0 -153
- package/.agent/aidevops/troubleshooting.md +0 -389
- package/.agent/aidevops.md +0 -124
- package/.agent/build-plus.md +0 -244
- package/.agent/content/guidelines.md +0 -109
- package/.agent/content.md +0 -87
- package/.agent/health.md +0 -59
- package/.agent/legal.md +0 -59
- package/.agent/loop-state/full-loop.local.md +0 -16
- package/.agent/loop-state/ralph-loop.local.md +0 -10
- package/.agent/marketing.md +0 -440
- package/.agent/memory/README.md +0 -260
- package/.agent/onboarding.md +0 -796
- package/.agent/plan-plus.md +0 -245
- package/.agent/research.md +0 -100
- package/.agent/sales.md +0 -333
- package/.agent/scripts/101domains-helper.sh +0 -701
- package/.agent/scripts/add-missing-returns.sh +0 -140
- package/.agent/scripts/agent-browser-helper.sh +0 -311
- package/.agent/scripts/agno-setup.sh +0 -712
- package/.agent/scripts/ahrefs-mcp-wrapper.js +0 -168
- package/.agent/scripts/aidevops-update-check.sh +0 -71
- package/.agent/scripts/ampcode-cli.sh +0 -522
- package/.agent/scripts/auto-version-bump.sh +0 -156
- package/.agent/scripts/autogen-helper.sh +0 -512
- package/.agent/scripts/beads-sync-helper.sh +0 -596
- package/.agent/scripts/closte-helper.sh +0 -5
- package/.agent/scripts/cloudron-helper.sh +0 -321
- package/.agent/scripts/codacy-cli-chunked.sh +0 -581
- package/.agent/scripts/codacy-cli.sh +0 -442
- package/.agent/scripts/code-audit-helper.sh +0 -5
- package/.agent/scripts/coderabbit-cli.sh +0 -417
- package/.agent/scripts/coderabbit-pro-analysis.sh +0 -238
- package/.agent/scripts/commands/code-simplifier.md +0 -86
- package/.agent/scripts/commands/full-loop.md +0 -246
- package/.agent/scripts/commands/postflight-loop.md +0 -103
- package/.agent/scripts/commands/recall.md +0 -182
- package/.agent/scripts/commands/remember.md +0 -132
- package/.agent/scripts/commands/save-todo.md +0 -175
- package/.agent/scripts/commands/session-review.md +0 -154
- package/.agent/scripts/comprehensive-quality-fix.sh +0 -106
- package/.agent/scripts/context-builder-helper.sh +0 -522
- package/.agent/scripts/coolify-cli-helper.sh +0 -674
- package/.agent/scripts/coolify-helper.sh +0 -380
- package/.agent/scripts/crawl4ai-examples.sh +0 -401
- package/.agent/scripts/crawl4ai-helper.sh +0 -1078
- package/.agent/scripts/crewai-helper.sh +0 -681
- package/.agent/scripts/dev-browser-helper.sh +0 -513
- package/.agent/scripts/dns-helper.sh +0 -396
- package/.agent/scripts/domain-research-helper.sh +0 -917
- package/.agent/scripts/dspy-helper.sh +0 -285
- package/.agent/scripts/dspyground-helper.sh +0 -291
- package/.agent/scripts/eeat-score-helper.sh +0 -1242
- package/.agent/scripts/efficient-return-fix.sh +0 -92
- package/.agent/scripts/extract-opencode-prompts.sh +0 -128
- package/.agent/scripts/find-missing-returns.sh +0 -113
- package/.agent/scripts/fix-auth-headers.sh +0 -104
- package/.agent/scripts/fix-common-strings.sh +0 -254
- package/.agent/scripts/fix-content-type.sh +0 -100
- package/.agent/scripts/fix-error-messages.sh +0 -130
- package/.agent/scripts/fix-misplaced-returns.sh +0 -74
- package/.agent/scripts/fix-remaining-literals.sh +0 -152
- package/.agent/scripts/fix-return-statements.sh +0 -41
- package/.agent/scripts/fix-s131-default-cases.sh +0 -249
- package/.agent/scripts/fix-sc2155-simple.sh +0 -102
- package/.agent/scripts/fix-shellcheck-critical.sh +0 -187
- package/.agent/scripts/fix-string-literals.sh +0 -273
- package/.agent/scripts/full-loop-helper.sh +0 -773
- package/.agent/scripts/generate-opencode-agents.sh +0 -497
- package/.agent/scripts/generate-opencode-commands.sh +0 -1629
- package/.agent/scripts/generate-skills.sh +0 -366
- package/.agent/scripts/git-platforms-helper.sh +0 -640
- package/.agent/scripts/gitea-cli-helper.sh +0 -743
- package/.agent/scripts/github-cli-helper.sh +0 -702
- package/.agent/scripts/gitlab-cli-helper.sh +0 -682
- package/.agent/scripts/gsc-add-user-helper.sh +0 -325
- package/.agent/scripts/gsc-sitemap-helper.sh +0 -678
- package/.agent/scripts/hetzner-helper.sh +0 -485
- package/.agent/scripts/hostinger-helper.sh +0 -229
- package/.agent/scripts/keyword-research-helper.sh +0 -1815
- package/.agent/scripts/langflow-helper.sh +0 -544
- package/.agent/scripts/linkedin-automation.py +0 -241
- package/.agent/scripts/linter-manager.sh +0 -599
- package/.agent/scripts/linters-local.sh +0 -434
- package/.agent/scripts/list-keys-helper.sh +0 -488
- package/.agent/scripts/local-browser-automation.py +0 -339
- package/.agent/scripts/localhost-helper.sh +0 -744
- package/.agent/scripts/loop-common.sh +0 -806
- package/.agent/scripts/mainwp-helper.sh +0 -728
- package/.agent/scripts/markdown-formatter.sh +0 -338
- package/.agent/scripts/markdown-lint-fix.sh +0 -311
- package/.agent/scripts/mass-fix-returns.sh +0 -58
- package/.agent/scripts/mcp-diagnose.sh +0 -167
- package/.agent/scripts/mcp-inspector-helper.sh +0 -449
- package/.agent/scripts/memory-helper.sh +0 -650
- package/.agent/scripts/monitor-code-review.sh +0 -255
- package/.agent/scripts/onboarding-helper.sh +0 -706
- package/.agent/scripts/opencode-github-setup-helper.sh +0 -797
- package/.agent/scripts/opencode-test-helper.sh +0 -213
- package/.agent/scripts/pagespeed-helper.sh +0 -464
- package/.agent/scripts/pandoc-helper.sh +0 -362
- package/.agent/scripts/postflight-check.sh +0 -555
- package/.agent/scripts/pre-commit-hook.sh +0 -259
- package/.agent/scripts/pre-edit-check.sh +0 -169
- package/.agent/scripts/qlty-cli.sh +0 -356
- package/.agent/scripts/quality-cli-manager.sh +0 -525
- package/.agent/scripts/quality-feedback-helper.sh +0 -462
- package/.agent/scripts/quality-fix.sh +0 -263
- package/.agent/scripts/quality-loop-helper.sh +0 -1108
- package/.agent/scripts/ralph-loop-helper.sh +0 -836
- package/.agent/scripts/ralph-upstream-check.sh +0 -341
- package/.agent/scripts/secretlint-helper.sh +0 -847
- package/.agent/scripts/servers-helper.sh +0 -241
- package/.agent/scripts/ses-helper.sh +0 -619
- package/.agent/scripts/session-review-helper.sh +0 -404
- package/.agent/scripts/setup-linters-wizard.sh +0 -379
- package/.agent/scripts/setup-local-api-keys.sh +0 -330
- package/.agent/scripts/setup-mcp-integrations.sh +0 -472
- package/.agent/scripts/shared-constants.sh +0 -246
- package/.agent/scripts/site-crawler-helper.sh +0 -1487
- package/.agent/scripts/snyk-helper.sh +0 -940
- package/.agent/scripts/sonarcloud-autofix.sh +0 -193
- package/.agent/scripts/sonarcloud-cli.sh +0 -191
- package/.agent/scripts/sonarscanner-cli.sh +0 -455
- package/.agent/scripts/spaceship-helper.sh +0 -747
- package/.agent/scripts/stagehand-helper.sh +0 -321
- package/.agent/scripts/stagehand-python-helper.sh +0 -321
- package/.agent/scripts/stagehand-python-setup.sh +0 -441
- package/.agent/scripts/stagehand-setup.sh +0 -439
- package/.agent/scripts/system-cleanup.sh +0 -340
- package/.agent/scripts/terminal-title-helper.sh +0 -388
- package/.agent/scripts/terminal-title-setup.sh +0 -549
- package/.agent/scripts/test-stagehand-both-integration.sh +0 -317
- package/.agent/scripts/test-stagehand-integration.sh +0 -309
- package/.agent/scripts/test-stagehand-python-integration.sh +0 -341
- package/.agent/scripts/todo-ready.sh +0 -263
- package/.agent/scripts/tool-version-check.sh +0 -362
- package/.agent/scripts/toon-helper.sh +0 -469
- package/.agent/scripts/twilio-helper.sh +0 -917
- package/.agent/scripts/updown-helper.sh +0 -279
- package/.agent/scripts/validate-mcp-integrations.sh +0 -250
- package/.agent/scripts/validate-version-consistency.sh +0 -131
- package/.agent/scripts/vaultwarden-helper.sh +0 -597
- package/.agent/scripts/vercel-cli-helper.sh +0 -816
- package/.agent/scripts/verify-mirrors.sh +0 -169
- package/.agent/scripts/version-manager.sh +0 -831
- package/.agent/scripts/webhosting-helper.sh +0 -471
- package/.agent/scripts/webhosting-verify.sh +0 -238
- package/.agent/scripts/wordpress-mcp-helper.sh +0 -508
- package/.agent/scripts/worktree-helper.sh +0 -595
- package/.agent/scripts/worktree-sessions.sh +0 -577
- package/.agent/seo/dataforseo.md +0 -215
- package/.agent/seo/domain-research.md +0 -532
- package/.agent/seo/eeat-score.md +0 -659
- package/.agent/seo/google-search-console.md +0 -366
- package/.agent/seo/gsc-sitemaps.md +0 -282
- package/.agent/seo/keyword-research.md +0 -521
- package/.agent/seo/serper.md +0 -278
- package/.agent/seo/site-crawler.md +0 -387
- package/.agent/seo.md +0 -236
- package/.agent/services/accounting/quickfile.md +0 -159
- package/.agent/services/communications/telfon.md +0 -470
- package/.agent/services/communications/twilio.md +0 -569
- package/.agent/services/crm/fluentcrm.md +0 -449
- package/.agent/services/email/ses.md +0 -399
- package/.agent/services/hosting/101domains.md +0 -378
- package/.agent/services/hosting/closte.md +0 -177
- package/.agent/services/hosting/cloudflare.md +0 -251
- package/.agent/services/hosting/cloudron.md +0 -478
- package/.agent/services/hosting/dns-providers.md +0 -335
- package/.agent/services/hosting/domain-purchasing.md +0 -344
- package/.agent/services/hosting/hetzner.md +0 -327
- package/.agent/services/hosting/hostinger.md +0 -287
- package/.agent/services/hosting/localhost.md +0 -419
- package/.agent/services/hosting/spaceship.md +0 -353
- package/.agent/services/hosting/webhosting.md +0 -330
- package/.agent/social-media.md +0 -69
- package/.agent/templates/plans-template.md +0 -114
- package/.agent/templates/prd-template.md +0 -129
- package/.agent/templates/tasks-template.md +0 -108
- package/.agent/templates/todo-template.md +0 -89
- package/.agent/tools/ai-assistants/agno.md +0 -471
- package/.agent/tools/ai-assistants/capsolver.md +0 -326
- package/.agent/tools/ai-assistants/configuration.md +0 -221
- package/.agent/tools/ai-assistants/overview.md +0 -209
- package/.agent/tools/ai-assistants/status.md +0 -171
- package/.agent/tools/ai-assistants/windsurf.md +0 -193
- package/.agent/tools/ai-orchestration/autogen.md +0 -406
- package/.agent/tools/ai-orchestration/crewai.md +0 -445
- package/.agent/tools/ai-orchestration/langflow.md +0 -405
- package/.agent/tools/ai-orchestration/openprose.md +0 -487
- package/.agent/tools/ai-orchestration/overview.md +0 -362
- package/.agent/tools/ai-orchestration/packaging.md +0 -647
- package/.agent/tools/browser/agent-browser.md +0 -464
- package/.agent/tools/browser/browser-automation.md +0 -400
- package/.agent/tools/browser/chrome-devtools.md +0 -282
- package/.agent/tools/browser/crawl4ai-integration.md +0 -422
- package/.agent/tools/browser/crawl4ai-resources.md +0 -277
- package/.agent/tools/browser/crawl4ai-usage.md +0 -416
- package/.agent/tools/browser/crawl4ai.md +0 -585
- package/.agent/tools/browser/dev-browser.md +0 -341
- package/.agent/tools/browser/pagespeed.md +0 -260
- package/.agent/tools/browser/playwright.md +0 -266
- package/.agent/tools/browser/playwriter.md +0 -310
- package/.agent/tools/browser/stagehand-examples.md +0 -456
- package/.agent/tools/browser/stagehand-python.md +0 -483
- package/.agent/tools/browser/stagehand.md +0 -421
- package/.agent/tools/build-agent/agent-review.md +0 -224
- package/.agent/tools/build-agent/build-agent.md +0 -784
- package/.agent/tools/build-mcp/aidevops-plugin.md +0 -476
- package/.agent/tools/build-mcp/api-wrapper.md +0 -445
- package/.agent/tools/build-mcp/build-mcp.md +0 -240
- package/.agent/tools/build-mcp/deployment.md +0 -401
- package/.agent/tools/build-mcp/server-patterns.md +0 -632
- package/.agent/tools/build-mcp/transports.md +0 -366
- package/.agent/tools/code-review/auditing.md +0 -383
- package/.agent/tools/code-review/automation.md +0 -219
- package/.agent/tools/code-review/best-practices.md +0 -203
- package/.agent/tools/code-review/codacy.md +0 -151
- package/.agent/tools/code-review/code-simplifier.md +0 -174
- package/.agent/tools/code-review/code-standards.md +0 -309
- package/.agent/tools/code-review/coderabbit.md +0 -101
- package/.agent/tools/code-review/management.md +0 -155
- package/.agent/tools/code-review/qlty.md +0 -248
- package/.agent/tools/code-review/secretlint.md +0 -565
- package/.agent/tools/code-review/setup.md +0 -250
- package/.agent/tools/code-review/snyk.md +0 -563
- package/.agent/tools/code-review/tools.md +0 -230
- package/.agent/tools/content/summarize.md +0 -353
- package/.agent/tools/context/augment-context-engine.md +0 -468
- package/.agent/tools/context/context-builder-agent.md +0 -76
- package/.agent/tools/context/context-builder.md +0 -375
- package/.agent/tools/context/context7.md +0 -371
- package/.agent/tools/context/dspy.md +0 -302
- package/.agent/tools/context/dspyground.md +0 -374
- package/.agent/tools/context/llm-tldr.md +0 -219
- package/.agent/tools/context/osgrep.md +0 -488
- package/.agent/tools/context/prompt-optimization.md +0 -338
- package/.agent/tools/context/toon.md +0 -292
- package/.agent/tools/conversion/pandoc.md +0 -304
- package/.agent/tools/credentials/api-key-management.md +0 -154
- package/.agent/tools/credentials/api-key-setup.md +0 -224
- package/.agent/tools/credentials/environment-variables.md +0 -180
- package/.agent/tools/credentials/vaultwarden.md +0 -382
- package/.agent/tools/data-extraction/outscraper.md +0 -974
- package/.agent/tools/deployment/coolify-cli.md +0 -388
- package/.agent/tools/deployment/coolify-setup.md +0 -353
- package/.agent/tools/deployment/coolify.md +0 -345
- package/.agent/tools/deployment/vercel.md +0 -390
- package/.agent/tools/git/authentication.md +0 -132
- package/.agent/tools/git/gitea-cli.md +0 -193
- package/.agent/tools/git/github-actions.md +0 -207
- package/.agent/tools/git/github-cli.md +0 -223
- package/.agent/tools/git/gitlab-cli.md +0 -190
- package/.agent/tools/git/opencode-github-security.md +0 -350
- package/.agent/tools/git/opencode-github.md +0 -328
- package/.agent/tools/git/opencode-gitlab.md +0 -252
- package/.agent/tools/git/security.md +0 -196
- package/.agent/tools/git.md +0 -207
- package/.agent/tools/opencode/oh-my-opencode.md +0 -375
- package/.agent/tools/opencode/opencode-anthropic-auth.md +0 -446
- package/.agent/tools/opencode/opencode.md +0 -651
- package/.agent/tools/social-media/bird.md +0 -437
- package/.agent/tools/task-management/beads.md +0 -336
- package/.agent/tools/terminal/terminal-title.md +0 -251
- package/.agent/tools/ui/shadcn.md +0 -196
- package/.agent/tools/ui/ui-skills.md +0 -115
- package/.agent/tools/wordpress/localwp.md +0 -311
- package/.agent/tools/wordpress/mainwp.md +0 -391
- package/.agent/tools/wordpress/scf.md +0 -527
- package/.agent/tools/wordpress/wp-admin.md +0 -729
- package/.agent/tools/wordpress/wp-dev.md +0 -940
- package/.agent/tools/wordpress/wp-preferred.md +0 -398
- package/.agent/tools/wordpress.md +0 -95
- package/.agent/workflows/branch/bugfix.md +0 -63
- package/.agent/workflows/branch/chore.md +0 -95
- package/.agent/workflows/branch/experiment.md +0 -115
- package/.agent/workflows/branch/feature.md +0 -59
- package/.agent/workflows/branch/hotfix.md +0 -98
- package/.agent/workflows/branch/refactor.md +0 -92
- package/.agent/workflows/branch/release.md +0 -96
- package/.agent/workflows/branch.md +0 -347
- package/.agent/workflows/bug-fixing.md +0 -267
- package/.agent/workflows/changelog.md +0 -129
- package/.agent/workflows/code-audit-remote.md +0 -279
- package/.agent/workflows/conversation-starter.md +0 -69
- package/.agent/workflows/error-feedback.md +0 -578
- package/.agent/workflows/feature-development.md +0 -355
- package/.agent/workflows/git-workflow.md +0 -702
- package/.agent/workflows/multi-repo-workspace.md +0 -268
- package/.agent/workflows/plans.md +0 -709
- package/.agent/workflows/postflight.md +0 -604
- package/.agent/workflows/pr.md +0 -571
- package/.agent/workflows/preflight.md +0 -278
- package/.agent/workflows/ralph-loop.md +0 -773
- package/.agent/workflows/release.md +0 -498
- package/.agent/workflows/session-manager.md +0 -254
- package/.agent/workflows/session-review.md +0 -311
- package/.agent/workflows/sql-migrations.md +0 -631
- package/.agent/workflows/version-bump.md +0 -283
- package/.agent/workflows/wiki-update.md +0 -333
- package/.agent/workflows/worktree.md +0 -477
|
@@ -1,595 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# shellcheck disable=SC2034,SC2155
|
|
3
|
-
|
|
4
|
-
# =============================================================================
|
|
5
|
-
# Git Worktree Helper Script
|
|
6
|
-
# =============================================================================
|
|
7
|
-
# Manage multiple working directories for parallel branch work.
|
|
8
|
-
# Each worktree is an independent directory on a different branch,
|
|
9
|
-
# sharing the same git database.
|
|
10
|
-
#
|
|
11
|
-
# Usage:
|
|
12
|
-
# worktree-helper.sh <command> [options]
|
|
13
|
-
#
|
|
14
|
-
# Commands:
|
|
15
|
-
# add <branch> [path] Create worktree for branch (auto-names path)
|
|
16
|
-
# list List all worktrees with status
|
|
17
|
-
# remove <path|branch> Remove a worktree
|
|
18
|
-
# status Show current worktree info
|
|
19
|
-
# switch <branch> Open/create worktree for branch (prints path)
|
|
20
|
-
# clean Remove worktrees for merged branches
|
|
21
|
-
# help Show this help
|
|
22
|
-
#
|
|
23
|
-
# Examples:
|
|
24
|
-
# worktree-helper.sh add feature/auth
|
|
25
|
-
# worktree-helper.sh switch bugfix/login
|
|
26
|
-
# worktree-helper.sh list
|
|
27
|
-
# worktree-helper.sh remove feature/auth
|
|
28
|
-
# worktree-helper.sh clean
|
|
29
|
-
# =============================================================================
|
|
30
|
-
|
|
31
|
-
set -euo pipefail
|
|
32
|
-
|
|
33
|
-
# Colors
|
|
34
|
-
readonly RED='\033[0;31m'
|
|
35
|
-
readonly GREEN='\033[0;32m'
|
|
36
|
-
readonly YELLOW='\033[1;33m'
|
|
37
|
-
readonly BLUE='\033[0;34m'
|
|
38
|
-
readonly BOLD='\033[1m'
|
|
39
|
-
readonly NC='\033[0m'
|
|
40
|
-
|
|
41
|
-
# Get repo info
|
|
42
|
-
get_repo_root() {
|
|
43
|
-
git rev-parse --show-toplevel 2>/dev/null || echo ""
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
get_repo_name() {
|
|
47
|
-
local root
|
|
48
|
-
root=$(get_repo_root)
|
|
49
|
-
if [[ -n "$root" ]]; then
|
|
50
|
-
basename "$root"
|
|
51
|
-
fi
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
get_current_branch() {
|
|
55
|
-
git branch --show-current 2>/dev/null || echo ""
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
# Get the default branch (main or master)
|
|
59
|
-
get_default_branch() {
|
|
60
|
-
# Try to get from remote HEAD
|
|
61
|
-
local default_branch
|
|
62
|
-
default_branch=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
|
|
63
|
-
|
|
64
|
-
if [[ -n "$default_branch" ]]; then
|
|
65
|
-
echo "$default_branch"
|
|
66
|
-
return 0
|
|
67
|
-
fi
|
|
68
|
-
|
|
69
|
-
# Fallback: check if main or master exists
|
|
70
|
-
if git show-ref --verify --quiet refs/heads/main 2>/dev/null; then
|
|
71
|
-
echo "main"
|
|
72
|
-
elif git show-ref --verify --quiet refs/heads/master 2>/dev/null; then
|
|
73
|
-
echo "master"
|
|
74
|
-
else
|
|
75
|
-
# Last resort default
|
|
76
|
-
echo "main"
|
|
77
|
-
fi
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
is_main_worktree() {
|
|
81
|
-
local git_dir
|
|
82
|
-
git_dir=$(git rev-parse --git-dir 2>/dev/null)
|
|
83
|
-
# Main worktree has .git as a directory, linked worktrees have .git as a file
|
|
84
|
-
[[ -d "$git_dir" ]] && [[ "$git_dir" == ".git" || "$git_dir" == "$(get_repo_root)/.git" ]]
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
# Check if a branch was ever pushed to remote
|
|
88
|
-
# Returns 0 (true) if branch has upstream or remote tracking
|
|
89
|
-
# Returns 1 (false) if branch was never pushed
|
|
90
|
-
branch_was_pushed() {
|
|
91
|
-
local branch="$1"
|
|
92
|
-
# Has upstream configured
|
|
93
|
-
if git config "branch.$branch.remote" &>/dev/null; then
|
|
94
|
-
return 0
|
|
95
|
-
fi
|
|
96
|
-
# Has remote tracking branch
|
|
97
|
-
if git show-ref --verify --quiet "refs/remotes/origin/$branch" 2>/dev/null; then
|
|
98
|
-
return 0
|
|
99
|
-
fi
|
|
100
|
-
return 1
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
# Check if worktree has uncommitted changes
|
|
104
|
-
worktree_has_changes() {
|
|
105
|
-
local worktree_path="$1"
|
|
106
|
-
if [[ -d "$worktree_path" ]]; then
|
|
107
|
-
local changes
|
|
108
|
-
changes=$(git -C "$worktree_path" status --porcelain 2>/dev/null | head -1)
|
|
109
|
-
[[ -n "$changes" ]]
|
|
110
|
-
else
|
|
111
|
-
return 1
|
|
112
|
-
fi
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
# Generate worktree path from branch name
|
|
116
|
-
# Pattern: ~/Git/{repo}-{branch-slug}
|
|
117
|
-
generate_worktree_path() {
|
|
118
|
-
local branch="$1"
|
|
119
|
-
local repo_name
|
|
120
|
-
repo_name=$(get_repo_name)
|
|
121
|
-
|
|
122
|
-
# Convert branch to slug: feature/auth-system -> feature-auth-system
|
|
123
|
-
local slug
|
|
124
|
-
slug=$(echo "$branch" | tr '/' '-' | tr '[:upper:]' '[:lower:]')
|
|
125
|
-
|
|
126
|
-
# Get parent directory of main repo
|
|
127
|
-
local parent_dir
|
|
128
|
-
parent_dir=$(dirname "$(get_repo_root)")
|
|
129
|
-
|
|
130
|
-
echo "${parent_dir}/${repo_name}-${slug}"
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
# Check if branch exists
|
|
134
|
-
branch_exists() {
|
|
135
|
-
local branch="$1"
|
|
136
|
-
git show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
# Check if worktree exists for branch
|
|
140
|
-
worktree_exists_for_branch() {
|
|
141
|
-
local branch="$1"
|
|
142
|
-
git worktree list --porcelain | grep -q "branch refs/heads/$branch$"
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
# Get worktree path for branch
|
|
146
|
-
get_worktree_path_for_branch() {
|
|
147
|
-
local branch="$1"
|
|
148
|
-
git worktree list --porcelain | grep -B2 "branch refs/heads/$branch$" | grep "^worktree " | cut -d' ' -f2-
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
# =============================================================================
|
|
152
|
-
# COMMANDS
|
|
153
|
-
# =============================================================================
|
|
154
|
-
|
|
155
|
-
cmd_add() {
|
|
156
|
-
local branch="${1:-}"
|
|
157
|
-
local path="${2:-}"
|
|
158
|
-
|
|
159
|
-
if [[ -z "$branch" ]]; then
|
|
160
|
-
echo -e "${RED}Error: Branch name required${NC}"
|
|
161
|
-
echo "Usage: worktree-helper.sh add <branch> [path]"
|
|
162
|
-
return 1
|
|
163
|
-
fi
|
|
164
|
-
|
|
165
|
-
# Check if we're in a git repo
|
|
166
|
-
if [[ -z "$(get_repo_root)" ]]; then
|
|
167
|
-
echo -e "${RED}Error: Not in a git repository${NC}"
|
|
168
|
-
return 1
|
|
169
|
-
fi
|
|
170
|
-
|
|
171
|
-
# Check if worktree already exists for this branch
|
|
172
|
-
if worktree_exists_for_branch "$branch"; then
|
|
173
|
-
local existing_path
|
|
174
|
-
existing_path=$(get_worktree_path_for_branch "$branch")
|
|
175
|
-
echo -e "${YELLOW}Worktree already exists for branch '$branch'${NC}"
|
|
176
|
-
echo -e "Path: ${BOLD}$existing_path${NC}"
|
|
177
|
-
echo ""
|
|
178
|
-
echo "To use it:"
|
|
179
|
-
echo " cd $existing_path" || exit
|
|
180
|
-
return 0
|
|
181
|
-
fi
|
|
182
|
-
|
|
183
|
-
# Generate path if not provided
|
|
184
|
-
if [[ -z "$path" ]]; then
|
|
185
|
-
path=$(generate_worktree_path "$branch")
|
|
186
|
-
fi
|
|
187
|
-
|
|
188
|
-
# Check if path already exists
|
|
189
|
-
if [[ -d "$path" ]]; then
|
|
190
|
-
echo -e "${RED}Error: Path already exists: $path${NC}"
|
|
191
|
-
return 1
|
|
192
|
-
fi
|
|
193
|
-
|
|
194
|
-
# Create worktree
|
|
195
|
-
if branch_exists "$branch"; then
|
|
196
|
-
# Branch exists, check it out
|
|
197
|
-
echo -e "${BLUE}Creating worktree for existing branch '$branch'...${NC}"
|
|
198
|
-
git worktree add "$path" "$branch"
|
|
199
|
-
else
|
|
200
|
-
# Branch doesn't exist, create it
|
|
201
|
-
echo -e "${BLUE}Creating worktree with new branch '$branch'...${NC}"
|
|
202
|
-
git worktree add -b "$branch" "$path"
|
|
203
|
-
fi
|
|
204
|
-
|
|
205
|
-
echo ""
|
|
206
|
-
echo -e "${GREEN}Worktree created successfully!${NC}"
|
|
207
|
-
echo ""
|
|
208
|
-
echo -e "Path: ${BOLD}$path${NC}"
|
|
209
|
-
echo -e "Branch: ${BOLD}$branch${NC}"
|
|
210
|
-
echo ""
|
|
211
|
-
echo "To start working:"
|
|
212
|
-
echo " cd $path" || exit
|
|
213
|
-
echo ""
|
|
214
|
-
echo "Or open in a new terminal/editor:"
|
|
215
|
-
echo " code $path # VS Code"
|
|
216
|
-
echo " cursor $path # Cursor"
|
|
217
|
-
echo " opencode $path # OpenCode"
|
|
218
|
-
|
|
219
|
-
return 0
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
cmd_list() {
|
|
223
|
-
echo -e "${BOLD}Git Worktrees:${NC}"
|
|
224
|
-
echo ""
|
|
225
|
-
|
|
226
|
-
local current_path
|
|
227
|
-
current_path=$(pwd)
|
|
228
|
-
|
|
229
|
-
# Parse worktree list
|
|
230
|
-
local worktree_path=""
|
|
231
|
-
local worktree_branch=""
|
|
232
|
-
local is_bare=""
|
|
233
|
-
|
|
234
|
-
while IFS= read -r line; do
|
|
235
|
-
if [[ "$line" =~ ^worktree\ (.+)$ ]]; then
|
|
236
|
-
worktree_path="${BASH_REMATCH[1]}"
|
|
237
|
-
elif [[ "$line" =~ ^branch\ refs/heads/(.+)$ ]]; then
|
|
238
|
-
worktree_branch="${BASH_REMATCH[1]}"
|
|
239
|
-
elif [[ "$line" == "bare" ]]; then
|
|
240
|
-
is_bare="true"
|
|
241
|
-
elif [[ -z "$line" ]]; then
|
|
242
|
-
# End of entry, print it
|
|
243
|
-
if [[ -n "$worktree_path" ]]; then
|
|
244
|
-
local marker=""
|
|
245
|
-
if [[ "$worktree_path" == "$current_path" ]]; then
|
|
246
|
-
marker=" ${GREEN}← current${NC}"
|
|
247
|
-
fi
|
|
248
|
-
|
|
249
|
-
if [[ "$is_bare" == "true" ]]; then
|
|
250
|
-
echo -e " ${YELLOW}(bare)${NC} $worktree_path"
|
|
251
|
-
else
|
|
252
|
-
# Check if branch is merged into default branch
|
|
253
|
-
local merged_marker=""
|
|
254
|
-
local default_branch
|
|
255
|
-
default_branch=$(get_default_branch)
|
|
256
|
-
if [[ -n "$worktree_branch" ]] && git branch --merged "$default_branch" 2>/dev/null | grep -q "^\s*$worktree_branch$"; then
|
|
257
|
-
merged_marker=" ${YELLOW}(merged)${NC}"
|
|
258
|
-
fi
|
|
259
|
-
|
|
260
|
-
echo -e " ${BOLD}$worktree_branch${NC}$merged_marker$marker"
|
|
261
|
-
echo -e " $worktree_path"
|
|
262
|
-
fi
|
|
263
|
-
echo ""
|
|
264
|
-
fi
|
|
265
|
-
worktree_path=""
|
|
266
|
-
worktree_branch=""
|
|
267
|
-
is_bare=""
|
|
268
|
-
fi
|
|
269
|
-
done < <(git worktree list --porcelain; echo "")
|
|
270
|
-
|
|
271
|
-
return 0
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
cmd_remove() {
|
|
275
|
-
local target="${1:-}"
|
|
276
|
-
|
|
277
|
-
if [[ -z "$target" ]]; then
|
|
278
|
-
echo -e "${RED}Error: Path or branch name required${NC}"
|
|
279
|
-
echo "Usage: worktree-helper.sh remove <path|branch>"
|
|
280
|
-
return 1
|
|
281
|
-
fi
|
|
282
|
-
|
|
283
|
-
local path_to_remove=""
|
|
284
|
-
|
|
285
|
-
# Check if target is a path
|
|
286
|
-
if [[ -d "$target" ]]; then
|
|
287
|
-
path_to_remove="$target"
|
|
288
|
-
else
|
|
289
|
-
# Assume it's a branch name
|
|
290
|
-
if worktree_exists_for_branch "$target"; then
|
|
291
|
-
path_to_remove=$(get_worktree_path_for_branch "$target")
|
|
292
|
-
else
|
|
293
|
-
echo -e "${RED}Error: No worktree found for '$target'${NC}"
|
|
294
|
-
return 1
|
|
295
|
-
fi
|
|
296
|
-
fi
|
|
297
|
-
|
|
298
|
-
# Don't allow removing main worktree
|
|
299
|
-
local main_worktree
|
|
300
|
-
main_worktree=$(git worktree list --porcelain | head -1 | cut -d' ' -f2-)
|
|
301
|
-
if [[ "$path_to_remove" == "$main_worktree" ]]; then
|
|
302
|
-
echo -e "${RED}Error: Cannot remove main worktree${NC}"
|
|
303
|
-
return 1
|
|
304
|
-
fi
|
|
305
|
-
|
|
306
|
-
# Check if we're currently in the worktree to remove
|
|
307
|
-
if [[ "$(pwd)" == "$path_to_remove"* ]]; then
|
|
308
|
-
echo -e "${RED}Error: Cannot remove worktree while inside it${NC}"
|
|
309
|
-
echo "First: cd $(get_repo_root)" || exit
|
|
310
|
-
return 1
|
|
311
|
-
fi
|
|
312
|
-
|
|
313
|
-
echo -e "${BLUE}Removing worktree: $path_to_remove${NC}"
|
|
314
|
-
git worktree remove "$path_to_remove"
|
|
315
|
-
|
|
316
|
-
echo -e "${GREEN}Worktree removed successfully${NC}"
|
|
317
|
-
return 0
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
cmd_status() {
|
|
321
|
-
local repo_root
|
|
322
|
-
repo_root=$(get_repo_root)
|
|
323
|
-
|
|
324
|
-
if [[ -z "$repo_root" ]]; then
|
|
325
|
-
echo -e "${RED}Error: Not in a git repository${NC}"
|
|
326
|
-
return 1
|
|
327
|
-
fi
|
|
328
|
-
|
|
329
|
-
local current_branch
|
|
330
|
-
current_branch=$(get_current_branch)
|
|
331
|
-
|
|
332
|
-
echo -e "${BOLD}Current Worktree Status:${NC}"
|
|
333
|
-
echo ""
|
|
334
|
-
echo -e " Repository: ${BOLD}$(get_repo_name)${NC}"
|
|
335
|
-
echo -e " Branch: ${BOLD}$current_branch${NC}"
|
|
336
|
-
echo -e " Path: $(pwd)"
|
|
337
|
-
|
|
338
|
-
if is_main_worktree; then
|
|
339
|
-
echo -e " Type: ${BLUE}Main worktree${NC}"
|
|
340
|
-
else
|
|
341
|
-
echo -e " Type: ${GREEN}Linked worktree${NC}"
|
|
342
|
-
fi
|
|
343
|
-
|
|
344
|
-
# Count total worktrees
|
|
345
|
-
local count
|
|
346
|
-
count=$(git worktree list | wc -l | tr -d ' ')
|
|
347
|
-
echo ""
|
|
348
|
-
echo -e " Total worktrees: $count"
|
|
349
|
-
|
|
350
|
-
if [[ "$count" -gt 1 ]]; then
|
|
351
|
-
echo ""
|
|
352
|
-
echo "Run 'worktree-helper.sh list' to see all worktrees"
|
|
353
|
-
fi
|
|
354
|
-
|
|
355
|
-
return 0
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
cmd_switch() {
|
|
359
|
-
local branch="${1:-}"
|
|
360
|
-
|
|
361
|
-
if [[ -z "$branch" ]]; then
|
|
362
|
-
echo -e "${RED}Error: Branch name required${NC}"
|
|
363
|
-
echo "Usage: worktree-helper.sh switch <branch>"
|
|
364
|
-
return 1
|
|
365
|
-
fi
|
|
366
|
-
|
|
367
|
-
# Check if worktree exists for this branch
|
|
368
|
-
if worktree_exists_for_branch "$branch"; then
|
|
369
|
-
local path
|
|
370
|
-
path=$(get_worktree_path_for_branch "$branch")
|
|
371
|
-
echo -e "${GREEN}Worktree exists for '$branch'${NC}"
|
|
372
|
-
echo ""
|
|
373
|
-
echo "Path: $path"
|
|
374
|
-
echo ""
|
|
375
|
-
echo "To switch:"
|
|
376
|
-
echo " cd $path" || exit
|
|
377
|
-
return 0
|
|
378
|
-
fi
|
|
379
|
-
|
|
380
|
-
# Create new worktree
|
|
381
|
-
echo -e "${BLUE}No worktree for '$branch', creating one...${NC}"
|
|
382
|
-
cmd_add "$branch"
|
|
383
|
-
return $?
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
cmd_clean() {
|
|
387
|
-
echo -e "${BOLD}Checking for worktrees with merged branches...${NC}"
|
|
388
|
-
echo ""
|
|
389
|
-
|
|
390
|
-
local found_any=false
|
|
391
|
-
local worktree_path=""
|
|
392
|
-
local worktree_branch=""
|
|
393
|
-
|
|
394
|
-
local default_branch
|
|
395
|
-
default_branch=$(get_default_branch)
|
|
396
|
-
|
|
397
|
-
# Fetch to get current remote branch state (detects deleted branches)
|
|
398
|
-
git fetch --prune origin 2>/dev/null || true
|
|
399
|
-
|
|
400
|
-
while IFS= read -r line; do
|
|
401
|
-
if [[ "$line" =~ ^worktree\ (.+)$ ]]; then
|
|
402
|
-
worktree_path="${BASH_REMATCH[1]}"
|
|
403
|
-
elif [[ "$line" =~ ^branch\ refs/heads/(.+)$ ]]; then
|
|
404
|
-
worktree_branch="${BASH_REMATCH[1]}"
|
|
405
|
-
elif [[ -z "$line" ]]; then
|
|
406
|
-
# End of entry, check if merged (skip default branch)
|
|
407
|
-
if [[ -n "$worktree_branch" ]] && [[ "$worktree_branch" != "$default_branch" ]]; then
|
|
408
|
-
local is_merged=false
|
|
409
|
-
local merge_type=""
|
|
410
|
-
|
|
411
|
-
# Check 1: Traditional merge detection
|
|
412
|
-
if git branch --merged "$default_branch" 2>/dev/null | grep -q "^\s*$worktree_branch$"; then
|
|
413
|
-
is_merged=true
|
|
414
|
-
merge_type="merged"
|
|
415
|
-
# Check 2: Remote branch deleted (indicates squash merge or PR closed)
|
|
416
|
-
# ONLY check this if the branch was previously pushed - unpushed branches should NOT be flagged
|
|
417
|
-
elif branch_was_pushed "$worktree_branch" && \
|
|
418
|
-
! git show-ref --verify --quiet "refs/remotes/origin/$worktree_branch" 2>/dev/null; then
|
|
419
|
-
is_merged=true
|
|
420
|
-
merge_type="remote deleted"
|
|
421
|
-
fi
|
|
422
|
-
|
|
423
|
-
# Safety check: skip if worktree has uncommitted changes
|
|
424
|
-
if [[ "$is_merged" == "true" ]] && worktree_has_changes "$worktree_path"; then
|
|
425
|
-
echo -e " ${RED}$worktree_branch${NC} (has uncommitted changes - skipping)"
|
|
426
|
-
echo " $worktree_path"
|
|
427
|
-
echo ""
|
|
428
|
-
is_merged=false
|
|
429
|
-
fi
|
|
430
|
-
|
|
431
|
-
if [[ "$is_merged" == "true" ]]; then
|
|
432
|
-
found_any=true
|
|
433
|
-
echo -e " ${YELLOW}$worktree_branch${NC} ($merge_type)"
|
|
434
|
-
echo " $worktree_path"
|
|
435
|
-
echo ""
|
|
436
|
-
fi
|
|
437
|
-
fi
|
|
438
|
-
worktree_path=""
|
|
439
|
-
worktree_branch=""
|
|
440
|
-
fi
|
|
441
|
-
done < <(git worktree list --porcelain; echo "")
|
|
442
|
-
|
|
443
|
-
if [[ "$found_any" == "false" ]]; then
|
|
444
|
-
echo -e "${GREEN}No merged worktrees to clean up${NC}"
|
|
445
|
-
return 0
|
|
446
|
-
fi
|
|
447
|
-
|
|
448
|
-
echo ""
|
|
449
|
-
echo -e "${YELLOW}Remove these worktrees? [y/N]${NC}"
|
|
450
|
-
read -r response
|
|
451
|
-
|
|
452
|
-
if [[ "$response" =~ ^[Yy]$ ]]; then
|
|
453
|
-
# Re-iterate and remove
|
|
454
|
-
while IFS= read -r line; do
|
|
455
|
-
if [[ "$line" =~ ^worktree\ (.+)$ ]]; then
|
|
456
|
-
worktree_path="${BASH_REMATCH[1]}"
|
|
457
|
-
elif [[ "$line" =~ ^branch\ refs/heads/(.+)$ ]]; then
|
|
458
|
-
worktree_branch="${BASH_REMATCH[1]}"
|
|
459
|
-
elif [[ -z "$line" ]]; then
|
|
460
|
-
if [[ -n "$worktree_branch" ]] && [[ "$worktree_branch" != "$default_branch" ]]; then
|
|
461
|
-
local should_remove=false
|
|
462
|
-
|
|
463
|
-
# Safety check: never remove worktrees with uncommitted changes
|
|
464
|
-
if worktree_has_changes "$worktree_path"; then
|
|
465
|
-
echo -e "${RED}Skipping $worktree_branch - has uncommitted changes${NC}"
|
|
466
|
-
should_remove=false
|
|
467
|
-
# Check 1: Traditional merge
|
|
468
|
-
elif git branch --merged "$default_branch" 2>/dev/null | grep -q "^\s*$worktree_branch$"; then
|
|
469
|
-
should_remove=true
|
|
470
|
-
# Check 2: Remote branch deleted - ONLY if branch was previously pushed
|
|
471
|
-
elif branch_was_pushed "$worktree_branch" && \
|
|
472
|
-
! git show-ref --verify --quiet "refs/remotes/origin/$worktree_branch" 2>/dev/null; then
|
|
473
|
-
should_remove=true
|
|
474
|
-
fi
|
|
475
|
-
|
|
476
|
-
if [[ "$should_remove" == "true" ]]; then
|
|
477
|
-
echo -e "${BLUE}Removing $worktree_branch...${NC}"
|
|
478
|
-
# Don't use --force to prevent data loss
|
|
479
|
-
if ! git worktree remove "$worktree_path" 2>/dev/null; then
|
|
480
|
-
echo -e "${RED}Failed to remove $worktree_branch - may have uncommitted changes${NC}"
|
|
481
|
-
else
|
|
482
|
-
# Also delete the local branch
|
|
483
|
-
git branch -D "$worktree_branch" 2>/dev/null || true
|
|
484
|
-
fi
|
|
485
|
-
fi
|
|
486
|
-
fi
|
|
487
|
-
worktree_path=""
|
|
488
|
-
worktree_branch=""
|
|
489
|
-
fi
|
|
490
|
-
done < <(git worktree list --porcelain; echo "")
|
|
491
|
-
|
|
492
|
-
echo -e "${GREEN}Cleanup complete${NC}"
|
|
493
|
-
else
|
|
494
|
-
echo "Cancelled"
|
|
495
|
-
fi
|
|
496
|
-
|
|
497
|
-
return 0
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
cmd_help() {
|
|
501
|
-
cat << 'EOF'
|
|
502
|
-
Git Worktree Helper - Parallel Branch Development
|
|
503
|
-
|
|
504
|
-
OVERVIEW
|
|
505
|
-
Git worktrees allow multiple working directories, each on a different branch,
|
|
506
|
-
sharing the same git database. Perfect for:
|
|
507
|
-
- Multiple terminal tabs on different branches
|
|
508
|
-
- Parallel AI sessions without branch conflicts
|
|
509
|
-
- Quick context switching without stashing
|
|
510
|
-
|
|
511
|
-
COMMANDS
|
|
512
|
-
add <branch> [path] Create worktree for branch
|
|
513
|
-
Path auto-generated as ~/Git/{repo}-{branch-slug}
|
|
514
|
-
|
|
515
|
-
list List all worktrees with status
|
|
516
|
-
|
|
517
|
-
remove <path|branch> Remove a worktree (keeps branch)
|
|
518
|
-
|
|
519
|
-
status Show current worktree info
|
|
520
|
-
|
|
521
|
-
switch <branch> Get/create worktree for branch (prints path)
|
|
522
|
-
|
|
523
|
-
clean Remove worktrees for merged branches
|
|
524
|
-
|
|
525
|
-
help Show this help
|
|
526
|
-
|
|
527
|
-
EXAMPLES
|
|
528
|
-
# Start work on a feature (creates worktree)
|
|
529
|
-
worktree-helper.sh add feature/user-auth
|
|
530
|
-
cd ~/Git/myrepo-feature-user-auth || exit
|
|
531
|
-
|
|
532
|
-
# Open another terminal for a bugfix
|
|
533
|
-
worktree-helper.sh add bugfix/login-timeout
|
|
534
|
-
cd ~/Git/myrepo-bugfix-login-timeout || exit
|
|
535
|
-
|
|
536
|
-
# List all worktrees
|
|
537
|
-
worktree-helper.sh list
|
|
538
|
-
|
|
539
|
-
# After merging, clean up
|
|
540
|
-
worktree-helper.sh clean
|
|
541
|
-
|
|
542
|
-
DIRECTORY STRUCTURE
|
|
543
|
-
~/Git/myrepo/ # Main worktree (main branch)
|
|
544
|
-
~/Git/myrepo-feature-user-auth/ # Linked worktree (feature/user-auth)
|
|
545
|
-
~/Git/myrepo-bugfix-login/ # Linked worktree (bugfix/login)
|
|
546
|
-
|
|
547
|
-
NOTES
|
|
548
|
-
- All worktrees share the same .git database (commits, stashes, refs)
|
|
549
|
-
- Each worktree is independent - no branch switching affects others
|
|
550
|
-
- Removing a worktree does NOT delete the branch
|
|
551
|
-
- Main worktree cannot be removed
|
|
552
|
-
|
|
553
|
-
EOF
|
|
554
|
-
return 0
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
# =============================================================================
|
|
558
|
-
# MAIN
|
|
559
|
-
# =============================================================================
|
|
560
|
-
|
|
561
|
-
main() {
|
|
562
|
-
local command="${1:-help}"
|
|
563
|
-
shift || true
|
|
564
|
-
|
|
565
|
-
case "$command" in
|
|
566
|
-
add)
|
|
567
|
-
cmd_add "$@"
|
|
568
|
-
;;
|
|
569
|
-
list|ls)
|
|
570
|
-
cmd_list "$@"
|
|
571
|
-
;;
|
|
572
|
-
remove|rm)
|
|
573
|
-
cmd_remove "$@"
|
|
574
|
-
;;
|
|
575
|
-
status|st)
|
|
576
|
-
cmd_status "$@"
|
|
577
|
-
;;
|
|
578
|
-
switch|sw)
|
|
579
|
-
cmd_switch "$@"
|
|
580
|
-
;;
|
|
581
|
-
clean)
|
|
582
|
-
cmd_clean "$@"
|
|
583
|
-
;;
|
|
584
|
-
help|--help|-h)
|
|
585
|
-
cmd_help
|
|
586
|
-
;;
|
|
587
|
-
*)
|
|
588
|
-
echo -e "${RED}Unknown command: $command${NC}"
|
|
589
|
-
echo "Run 'worktree-helper.sh help' for usage"
|
|
590
|
-
return 1
|
|
591
|
-
;;
|
|
592
|
-
esac
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
main "$@"
|