ace-git-worktree 0.19.0

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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.ace-defaults/git/worktree.yml +250 -0
  3. data/.ace-defaults/nav/protocols/wfi-sources/ace-git-worktree.yml +19 -0
  4. data/CHANGELOG.md +957 -0
  5. data/LICENSE +21 -0
  6. data/README.md +40 -0
  7. data/Rakefile +14 -0
  8. data/docs/demo/ace-git-worktree-getting-started.gif +0 -0
  9. data/docs/demo/ace-git-worktree-getting-started.tape.yml +28 -0
  10. data/docs/demo/fixtures/README.md +3 -0
  11. data/docs/demo/fixtures/sample.txt +1 -0
  12. data/docs/getting-started.md +114 -0
  13. data/docs/handbook.md +38 -0
  14. data/docs/usage.md +334 -0
  15. data/exe/ace-git-worktree +24 -0
  16. data/handbook/agents/worktree.ag.md +189 -0
  17. data/handbook/skills/as-git-worktree/SKILL.md +27 -0
  18. data/handbook/skills/as-git-worktree-create/SKILL.md +21 -0
  19. data/handbook/skills/as-git-worktree-manage/SKILL.md +20 -0
  20. data/handbook/workflow-instructions/git/worktree-create.wf.md +262 -0
  21. data/handbook/workflow-instructions/git/worktree-manage.wf.md +384 -0
  22. data/handbook/workflow-instructions/git/worktree.wf.md +224 -0
  23. data/lib/ace/git/worktree/atoms/git_command.rb +121 -0
  24. data/lib/ace/git/worktree/atoms/path_expander.rb +189 -0
  25. data/lib/ace/git/worktree/atoms/slug_generator.rb +235 -0
  26. data/lib/ace/git/worktree/atoms/task_id_extractor.rb +91 -0
  27. data/lib/ace/git/worktree/cli/commands/config.rb +50 -0
  28. data/lib/ace/git/worktree/cli/commands/create.rb +80 -0
  29. data/lib/ace/git/worktree/cli/commands/list.rb +76 -0
  30. data/lib/ace/git/worktree/cli/commands/prune.rb +43 -0
  31. data/lib/ace/git/worktree/cli/commands/remove.rb +48 -0
  32. data/lib/ace/git/worktree/cli/commands/shared_helpers.rb +66 -0
  33. data/lib/ace/git/worktree/cli/commands/switch.rb +44 -0
  34. data/lib/ace/git/worktree/cli.rb +103 -0
  35. data/lib/ace/git/worktree/commands/config_command.rb +351 -0
  36. data/lib/ace/git/worktree/commands/create_command.rb +961 -0
  37. data/lib/ace/git/worktree/commands/list_command.rb +247 -0
  38. data/lib/ace/git/worktree/commands/prune_command.rb +260 -0
  39. data/lib/ace/git/worktree/commands/remove_command.rb +522 -0
  40. data/lib/ace/git/worktree/commands/switch_command.rb +249 -0
  41. data/lib/ace/git/worktree/configuration.rb +167 -0
  42. data/lib/ace/git/worktree/models/worktree_config.rb +502 -0
  43. data/lib/ace/git/worktree/models/worktree_info.rb +303 -0
  44. data/lib/ace/git/worktree/models/worktree_metadata.rb +294 -0
  45. data/lib/ace/git/worktree/molecules/config_loader.rb +125 -0
  46. data/lib/ace/git/worktree/molecules/current_task_linker.rb +136 -0
  47. data/lib/ace/git/worktree/molecules/hook_executor.rb +361 -0
  48. data/lib/ace/git/worktree/molecules/parent_task_resolver.rb +186 -0
  49. data/lib/ace/git/worktree/molecules/pr_creator.rb +253 -0
  50. data/lib/ace/git/worktree/molecules/task_committer.rb +329 -0
  51. data/lib/ace/git/worktree/molecules/task_fetcher.rb +244 -0
  52. data/lib/ace/git/worktree/molecules/task_pusher.rb +183 -0
  53. data/lib/ace/git/worktree/molecules/task_status_updater.rb +447 -0
  54. data/lib/ace/git/worktree/molecules/worktree_creator.rb +832 -0
  55. data/lib/ace/git/worktree/molecules/worktree_lister.rb +337 -0
  56. data/lib/ace/git/worktree/molecules/worktree_remover.rb +416 -0
  57. data/lib/ace/git/worktree/organisms/task_worktree_orchestrator.rb +906 -0
  58. data/lib/ace/git/worktree/organisms/worktree_manager.rb +714 -0
  59. data/lib/ace/git/worktree/version.rb +9 -0
  60. data/lib/ace/git/worktree.rb +215 -0
  61. metadata +218 -0
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ace
4
+ module Git
5
+ module Worktree
6
+ VERSION = "0.19.0"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,215 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ # Define CommandTimeout if not available (for some Ruby installations)
6
+ unless Open3.const_defined?(:CommandTimeout)
7
+ module Open3
8
+ class CommandTimeout < StandardError; end
9
+ end
10
+ end
11
+
12
+ # Core ace-git dependency for Git operations
13
+ require "ace/git"
14
+ require "ace/support/config"
15
+
16
+ require_relative "worktree/version"
17
+
18
+ module Ace
19
+ module Git
20
+ # Main module for ace-git-worktree gem
21
+ #
22
+ # This gem provides task-aware git worktree management capabilities
23
+ # integrated with the ACE task management system.
24
+ #
25
+ # Key features:
26
+ # - Task-aware worktree creation with automatic metadata lookup
27
+ # - Integration with ace-task for task information
28
+ # - Configuration-driven naming conventions
29
+ # - Automated environment setup (mise trust)
30
+ # - Support for traditional worktree operations
31
+ #
32
+ # @example Task-aware worktree creation
33
+ # require 'ace/git/worktree'
34
+ #
35
+ # # Create a worktree for a task
36
+ # orchestrator = Ace::Git::Worktree::TaskWorktreeOrchestrator.new
37
+ # result = orchestrator.create_for_task("081")
38
+ #
39
+ # @example Traditional worktree creation
40
+ # manager = Ace::Git::Worktree::WorktreeManager.new
41
+ # result = manager.create("feature-branch")
42
+ #
43
+ # @example Access timeout configuration
44
+ # Ace::Git::Worktree.default_timeout # => 30
45
+ # Ace::Git::Worktree.max_timeout # => 300
46
+ module Worktree
47
+ # Mutex for thread-safe config initialization
48
+ @config_mutex = Mutex.new
49
+
50
+ class << self
51
+ # Get configuration for ace-git-worktree
52
+ # Follows ADR-022: Configuration Default and Override Pattern
53
+ # Uses Ace::Support::Config.create() for configuration cascade resolution
54
+ # Thread-safe: uses mutex for initialization
55
+ # @return [Hash] merged configuration hash
56
+ # @example Get current configuration
57
+ # config = Ace::Git::Worktree.config
58
+ # puts config.dig("timeouts", "default") # => 30
59
+ def config
60
+ # Fast path: return cached config if already initialized
61
+ return @config if defined?(@config) && @config
62
+
63
+ # Thread-safe initialization
64
+ @config_mutex.synchronize do
65
+ @config ||= load_config
66
+ end
67
+ end
68
+
69
+ # Reset configuration cache (mainly for testing)
70
+ # Thread-safe: uses mutex to prevent race conditions
71
+ def reset_config!
72
+ @config_mutex.synchronize do
73
+ @config = nil
74
+ end
75
+ end
76
+
77
+ # ---- Timeout Helper Methods (ADR-022 compliant) ----
78
+ # These read from config instead of using hardcoded constants
79
+
80
+ # Default timeout for general git operations
81
+ # @return [Integer] Timeout in seconds (default: 30)
82
+ def default_timeout
83
+ config.dig("timeouts", "default") || 30
84
+ end
85
+
86
+ # Maximum allowed timeout for any operation
87
+ # @return [Integer] Timeout in seconds (default: 300)
88
+ def max_timeout
89
+ config.dig("timeouts", "max") || 300
90
+ end
91
+
92
+ # Timeout for after_create hook commands
93
+ # @return [Integer] Timeout in seconds (default: 30)
94
+ def hook_timeout
95
+ config.dig("timeouts", "hook") || 30
96
+ end
97
+
98
+ # Timeout for worktree list operations
99
+ # @return [Integer] Timeout in seconds (default: 30)
100
+ def list_timeout
101
+ config.dig("timeouts", "list") || 30
102
+ end
103
+
104
+ # Timeout for git commit operations
105
+ # @return [Integer] Timeout in seconds (default: 30)
106
+ def commit_timeout
107
+ config.dig("timeouts", "commit") || 30
108
+ end
109
+
110
+ # Timeout for worktree removal operations
111
+ # @return [Integer] Timeout in seconds (default: 30)
112
+ def remove_timeout
113
+ config.dig("timeouts", "remove") || 30
114
+ end
115
+
116
+ private
117
+
118
+ # Load configuration using Ace::Support::Config cascade
119
+ # Resolves gem defaults from .ace-defaults/ and user overrides from .ace/
120
+ # @return [Hash] Merged and transformed configuration
121
+ def load_config
122
+ gem_root = Gem.loaded_specs["ace-git-worktree"]&.gem_dir ||
123
+ File.expand_path("../../../..", __dir__)
124
+
125
+ resolver = Ace::Support::Config.create(
126
+ config_dir: ".ace",
127
+ defaults_dir: ".ace-defaults",
128
+ gem_path: gem_root
129
+ )
130
+
131
+ # Resolve config for git/worktree namespace
132
+ config_result = resolver.resolve_namespace("git", filename: "worktree")
133
+
134
+ # Extract and flatten the git.worktree section for backward compatibility
135
+ raw_config = config_result.data
136
+ extract_worktree_config(raw_config)
137
+ rescue Ace::Support::Config::YamlParseError => e
138
+ warn "ace-git-worktree: YAML syntax error in configuration"
139
+ warn " #{e.message}"
140
+ # Fall back to gem defaults
141
+ load_gem_defaults_fallback
142
+ rescue => e
143
+ warn "ace-git-worktree: Failed to load configuration: #{e.message}"
144
+ load_gem_defaults_fallback
145
+ end
146
+
147
+ # Load gem defaults directly as fallback when cascade resolution fails
148
+ # @return [Hash] Defaults hash or empty hash if defaults also fail
149
+ def load_gem_defaults_fallback
150
+ gem_root = Gem.loaded_specs["ace-git-worktree"]&.gem_dir ||
151
+ File.expand_path("../../../..", __dir__)
152
+
153
+ defaults_path = File.join(gem_root, ".ace-defaults", "git", "worktree.yml")
154
+
155
+ return {} unless File.exist?(defaults_path)
156
+
157
+ data = YAML.safe_load_file(defaults_path, permitted_classes: [Date], aliases: true) || {}
158
+ extract_worktree_config(data)
159
+ rescue
160
+ {} # Only return empty hash if even defaults fail to load
161
+ end
162
+
163
+ # Extract worktree configuration from YAML structure
164
+ # Unwraps git.worktree nesting for easier access
165
+ # @param raw_config [Hash] The raw YAML config
166
+ # @return [Hash] Flattened worktree configuration
167
+ def extract_worktree_config(raw_config)
168
+ return {} if raw_config.nil? || raw_config.empty?
169
+
170
+ # Handle git.worktree nesting
171
+ if raw_config.key?("git") && raw_config["git"].is_a?(Hash)
172
+ raw_config["git"]["worktree"] || raw_config["git"]
173
+ elsif raw_config.key?("worktree") && raw_config["worktree"].is_a?(Hash)
174
+ raw_config["worktree"]
175
+ else
176
+ raw_config
177
+ end
178
+ end
179
+ end
180
+
181
+ # Load all the core components
182
+ require_relative "worktree/configuration"
183
+ require_relative "worktree/models/worktree_config"
184
+ require_relative "worktree/models/worktree_info"
185
+ require_relative "worktree/models/worktree_metadata"
186
+
187
+ require_relative "worktree/atoms/git_command"
188
+ require_relative "worktree/atoms/path_expander"
189
+ require_relative "worktree/atoms/slug_generator"
190
+
191
+ require_relative "worktree/molecules/config_loader"
192
+ require_relative "worktree/molecules/task_fetcher"
193
+ require_relative "worktree/molecules/pr_creator"
194
+ require_relative "worktree/molecules/task_committer"
195
+ require_relative "worktree/molecules/task_pusher"
196
+ require_relative "worktree/molecules/task_status_updater"
197
+ require_relative "worktree/molecules/worktree_creator"
198
+ require_relative "worktree/molecules/worktree_lister"
199
+ require_relative "worktree/molecules/worktree_remover"
200
+ require_relative "worktree/molecules/hook_executor"
201
+
202
+ require_relative "worktree/organisms/task_worktree_orchestrator"
203
+ require_relative "worktree/organisms/worktree_manager"
204
+
205
+ require_relative "worktree/commands/create_command"
206
+ require_relative "worktree/commands/list_command"
207
+ require_relative "worktree/commands/switch_command"
208
+ require_relative "worktree/commands/remove_command"
209
+ require_relative "worktree/commands/prune_command"
210
+ require_relative "worktree/commands/config_command"
211
+
212
+ require_relative "worktree/cli"
213
+ end
214
+ end
215
+ end
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ace-git-worktree
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.19.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Czyz
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ace-support-cli
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.3'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.3'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ace-support-core
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.24'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.24'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ace-support-config
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.7'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.7'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ace-git
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.11'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.11'
68
+ - !ruby/object:Gem::Dependency
69
+ name: ace-task
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.11'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.11'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: minitest
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: ace-support-test-helpers
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.12'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.12'
124
+ description: |
125
+ ace-git-worktree creates isolated worktrees for tasks, pull requests, and
126
+ branches, with task metadata updates, configurable hooks, and cleanup
127
+ workflows for focused development.
128
+ email:
129
+ - mc@cs3b.com
130
+ executables:
131
+ - ace-git-worktree
132
+ extensions: []
133
+ extra_rdoc_files: []
134
+ files:
135
+ - ".ace-defaults/git/worktree.yml"
136
+ - ".ace-defaults/nav/protocols/wfi-sources/ace-git-worktree.yml"
137
+ - CHANGELOG.md
138
+ - LICENSE
139
+ - README.md
140
+ - Rakefile
141
+ - docs/demo/ace-git-worktree-getting-started.gif
142
+ - docs/demo/ace-git-worktree-getting-started.tape.yml
143
+ - docs/demo/fixtures/README.md
144
+ - docs/demo/fixtures/sample.txt
145
+ - docs/getting-started.md
146
+ - docs/handbook.md
147
+ - docs/usage.md
148
+ - exe/ace-git-worktree
149
+ - handbook/agents/worktree.ag.md
150
+ - handbook/skills/as-git-worktree-create/SKILL.md
151
+ - handbook/skills/as-git-worktree-manage/SKILL.md
152
+ - handbook/skills/as-git-worktree/SKILL.md
153
+ - handbook/workflow-instructions/git/worktree-create.wf.md
154
+ - handbook/workflow-instructions/git/worktree-manage.wf.md
155
+ - handbook/workflow-instructions/git/worktree.wf.md
156
+ - lib/ace/git/worktree.rb
157
+ - lib/ace/git/worktree/atoms/git_command.rb
158
+ - lib/ace/git/worktree/atoms/path_expander.rb
159
+ - lib/ace/git/worktree/atoms/slug_generator.rb
160
+ - lib/ace/git/worktree/atoms/task_id_extractor.rb
161
+ - lib/ace/git/worktree/cli.rb
162
+ - lib/ace/git/worktree/cli/commands/config.rb
163
+ - lib/ace/git/worktree/cli/commands/create.rb
164
+ - lib/ace/git/worktree/cli/commands/list.rb
165
+ - lib/ace/git/worktree/cli/commands/prune.rb
166
+ - lib/ace/git/worktree/cli/commands/remove.rb
167
+ - lib/ace/git/worktree/cli/commands/shared_helpers.rb
168
+ - lib/ace/git/worktree/cli/commands/switch.rb
169
+ - lib/ace/git/worktree/commands/config_command.rb
170
+ - lib/ace/git/worktree/commands/create_command.rb
171
+ - lib/ace/git/worktree/commands/list_command.rb
172
+ - lib/ace/git/worktree/commands/prune_command.rb
173
+ - lib/ace/git/worktree/commands/remove_command.rb
174
+ - lib/ace/git/worktree/commands/switch_command.rb
175
+ - lib/ace/git/worktree/configuration.rb
176
+ - lib/ace/git/worktree/models/worktree_config.rb
177
+ - lib/ace/git/worktree/models/worktree_info.rb
178
+ - lib/ace/git/worktree/models/worktree_metadata.rb
179
+ - lib/ace/git/worktree/molecules/config_loader.rb
180
+ - lib/ace/git/worktree/molecules/current_task_linker.rb
181
+ - lib/ace/git/worktree/molecules/hook_executor.rb
182
+ - lib/ace/git/worktree/molecules/parent_task_resolver.rb
183
+ - lib/ace/git/worktree/molecules/pr_creator.rb
184
+ - lib/ace/git/worktree/molecules/task_committer.rb
185
+ - lib/ace/git/worktree/molecules/task_fetcher.rb
186
+ - lib/ace/git/worktree/molecules/task_pusher.rb
187
+ - lib/ace/git/worktree/molecules/task_status_updater.rb
188
+ - lib/ace/git/worktree/molecules/worktree_creator.rb
189
+ - lib/ace/git/worktree/molecules/worktree_lister.rb
190
+ - lib/ace/git/worktree/molecules/worktree_remover.rb
191
+ - lib/ace/git/worktree/organisms/task_worktree_orchestrator.rb
192
+ - lib/ace/git/worktree/organisms/worktree_manager.rb
193
+ - lib/ace/git/worktree/version.rb
194
+ homepage: https://github.com/cs3b/ace
195
+ licenses:
196
+ - MIT
197
+ metadata:
198
+ homepage_uri: https://github.com/cs3b/ace
199
+ source_code_uri: https://github.com/cs3b/ace/tree/main/ace-git-worktree
200
+ changelog_uri: https://github.com/cs3b/ace/blob/main/ace-git-worktree/CHANGELOG.md
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: 3.2.0
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ requirements: []
215
+ rubygems_version: 3.6.9
216
+ specification_version: 4
217
+ summary: Task-aware git worktree management with isolated environments in one command
218
+ test_files: []