worktrees 0.1.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 (50) hide show
  1. checksums.yaml +7 -0
  2. data/.claude/commands/plan.md +42 -0
  3. data/.claude/commands/specify.md +12 -0
  4. data/.claude/commands/tasks.md +60 -0
  5. data/.cursor/commands/plan.md +42 -0
  6. data/.cursor/commands/specify.md +12 -0
  7. data/.cursor/commands/tasks.md +60 -0
  8. data/.cursor/rules +81 -0
  9. data/.specify/memory/constitution-v1.0.1-formal.md +90 -0
  10. data/.specify/memory/constitution.md +153 -0
  11. data/.specify/memory/constitution_update_checklist.md +88 -0
  12. data/.specify/scripts/bash/check-task-prerequisites.sh +15 -0
  13. data/.specify/scripts/bash/common.sh +37 -0
  14. data/.specify/scripts/bash/create-new-feature.sh +58 -0
  15. data/.specify/scripts/bash/get-feature-paths.sh +7 -0
  16. data/.specify/scripts/bash/setup-plan.sh +17 -0
  17. data/.specify/scripts/bash/update-agent-context.sh +57 -0
  18. data/.specify/templates/agent-file-template.md +23 -0
  19. data/.specify/templates/plan-template.md +254 -0
  20. data/.specify/templates/spec-template.md +116 -0
  21. data/.specify/templates/tasks-template.md +152 -0
  22. data/CLAUDE.md +145 -0
  23. data/Gemfile +15 -0
  24. data/Gemfile.lock +150 -0
  25. data/README.md +163 -0
  26. data/Rakefile +52 -0
  27. data/exe/worktrees +52 -0
  28. data/lib/worktrees/cli.rb +36 -0
  29. data/lib/worktrees/commands/create.rb +74 -0
  30. data/lib/worktrees/commands/list.rb +87 -0
  31. data/lib/worktrees/commands/remove.rb +62 -0
  32. data/lib/worktrees/commands/status.rb +95 -0
  33. data/lib/worktrees/commands/switch.rb +57 -0
  34. data/lib/worktrees/git_operations.rb +106 -0
  35. data/lib/worktrees/models/feature_worktree.rb +92 -0
  36. data/lib/worktrees/models/repository.rb +75 -0
  37. data/lib/worktrees/models/worktree_config.rb +74 -0
  38. data/lib/worktrees/version.rb +5 -0
  39. data/lib/worktrees/worktree_manager.rb +238 -0
  40. data/lib/worktrees.rb +27 -0
  41. data/specs/001-build-a-tool/GEMINI.md +20 -0
  42. data/specs/001-build-a-tool/contracts/cli-contracts.md +43 -0
  43. data/specs/001-build-a-tool/contracts/openapi.yaml +135 -0
  44. data/specs/001-build-a-tool/data-model.md +51 -0
  45. data/specs/001-build-a-tool/plan.md +241 -0
  46. data/specs/001-build-a-tool/quickstart.md +67 -0
  47. data/specs/001-build-a-tool/research.md +76 -0
  48. data/specs/001-build-a-tool/spec.md +153 -0
  49. data/specs/001-build-a-tool/tasks.md +209 -0
  50. metadata +138 -0
@@ -0,0 +1,209 @@
1
+ # Tasks: Manage Git feature worktrees
2
+
3
+ **Input**: Design documents from `/Users/drewgoddyn/projects/claude-worktrees/specs/001-build-a-tool/`
4
+ **Prerequisites**: plan.md (required), research.md, data-model.md, contracts/
5
+
6
+ ## Execution Flow (main)
7
+ ```
8
+ 1. Load plan.md from feature directory
9
+ → If not found: ERROR "No implementation plan found"
10
+ → Extract: tech stack, libraries, structure
11
+ 2. Load optional design documents:
12
+ → data-model.md: Extract entities → model tasks
13
+ → contracts/: Each file → contract test task
14
+ → research.md: Extract decisions → setup tasks
15
+ → quickstart.md: Extract user flows → integration tests
16
+ 3. Generate tasks by category:
17
+ → Setup: project init, dependencies, linting
18
+ → Tests: contract tests, integration tests
19
+ → Core: models, services, CLI commands
20
+ → Integration: flags, safety checks, logging
21
+ → Polish: unit tests, performance, docs
22
+ 4. Apply task rules:
23
+ → Different files = mark [P] for parallel
24
+ → Same file = sequential (no [P])
25
+ → Tests before implementation (TDD)
26
+ 5. Number tasks sequentially (T001, T002...)
27
+ 6. Generate dependency graph
28
+ 7. Create parallel execution examples
29
+ 8. Validate task completeness:
30
+ → All contracts have tests?
31
+ → All entities have models?
32
+ → All endpoints implemented?
33
+ 9. Return: SUCCESS (tasks ready for execution)
34
+ ```
35
+
36
+ ## Format: `[ID] [P?] Description`
37
+ - **[P]**: Can run in parallel (different files, no dependencies)
38
+ - Include exact file paths in descriptions
39
+
40
+ ## Path Conventions
41
+ - **Single project** per plan: `src/`, `tests/` at repository root
42
+ - Absolute repo root: `/Users/drewgoddyn/projects/claude-worktrees`
43
+
44
+ ## Phase 3.1: Setup
45
+ - [x] T001 Create project structure per implementation plan
46
+ - Paths: `/Users/drewgoddyn/projects/claude-worktrees/src/{cli,models,services,lib}` and `/Users/drewgoddyn/projects/claude-worktrees/tests/{contract,integration,unit}`, `/Users/drewgoddyn/projects/claude-worktrees/scripts`
47
+ - [x] T002 Initialize Bash CLI scaffold and tooling
48
+ - Create entrypoint: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees` with `--help|--version|--format` scaffolding only (no behaviors)
49
+ - Create Makefile with targets: `test`, `lint`, `fmt`
50
+ - Add runner scripts: `/Users/drewgoddyn/projects/claude-worktrees/scripts/test.sh`, `/Users/drewgoddyn/projects/claude-worktrees/scripts/lint.sh`, `/Users/drewgoddyn/projects/claude-worktrees/scripts/format.sh`
51
+ - [x] T003 [P] Configure linting and formatting
52
+ - ShellCheck config at `/Users/drewgoddyn/projects/claude-worktrees/.shellcheckrc`
53
+ - shfmt usage in `scripts/format.sh`
54
+
55
+ ## Phase 3.2: Tests First (TDD) ⚠️ MUST COMPLETE BEFORE 3.3
56
+ **CRITICAL: These tests MUST be written and MUST FAIL before ANY implementation**
57
+ - [x] T004 [P] Contract tests from `cli-contracts.md`
58
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/contract/cli_contracts.bats`
59
+ - Scope: Validate command shapes and flags for `worktrees create|list|switch|remove|status`, exit codes, stderr vs stdout
60
+ - [x] T005 [P] Contract tests from `openapi.yaml`
61
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/contract/openapi_worktrees.bats`
62
+ - Scope: Validate `--format json` output schema for list/create/switch/remove/status against OpenAPI fields
63
+ - [x] T006 [P] Integration test: create a worktree
64
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/integration/create_worktree.bats`
65
+ - Scenario from quickstart.md "Create a worktree"
66
+ - [x] T007 [P] Integration test: list worktrees (paged)
67
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/integration/list_worktrees.bats`
68
+ - Scenario from quickstart.md "List worktrees (paged)"
69
+ - [x] T008 [P] Integration test: switch to a worktree
70
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/integration/switch_worktree.bats`
71
+ - Scenario from quickstart.md "Switch to a worktree"
72
+ - [x] T009 [P] Integration test: remove worktree (keep branch)
73
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/integration/remove_keep_branch.bats`
74
+ - Scenario from quickstart.md "Remove a worktree safely (keep branch)"
75
+ - [x] T010 [P] Integration test: remove worktree and delete branch when merged
76
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/integration/remove_delete_branch.bats`
77
+ - Scenario from quickstart.md "Remove and delete branch when fully merged"
78
+
79
+ ## Phase 3.3: Core Implementation (ONLY after tests are failing)
80
+ ### Models (from data-model.md)
81
+ - [x] T011 [P] Repository model functions
82
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/models/repository.sh`
83
+ - Implement: detect repo root; resolve default base from remote HEAD→main→master
84
+ - [x] T012 [P] FeatureName model and validation
85
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/models/feature_name.sh`
86
+ - Implement: regex `^[0-9]{3}-[a-z0-9-]{1,40}$`, reserved names, normalization
87
+ - [x] T013 [P] Worktree model
88
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/models/worktree.sh`
89
+ - Implement: representation; parse `git worktree list --porcelain` into fields; derived `active`
90
+ - [x] T014 [P] ListQuery model
91
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/models/list_query.sh`
92
+ - Implement: filterName, filterBase, page, pageSize with validation and caps
93
+
94
+ ### Services and libs
95
+ - [x] T015 [P] Worktree service stubs
96
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/services/worktree_service.sh`
97
+ - Implement: `create_worktree`, `list_worktrees`, `switch_worktree`, `remove_worktree` interfaces (no CLI wiring yet)
98
+ - [x] T016 [P] JSON utilities for structured output
99
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/lib/json.sh`
100
+ - Implement: safe JSON quoting/encoding for text|json outputs (no jq dependency)
101
+ - [x] T017 [P] IO utilities and exit code mapping
102
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/lib/io.sh`
103
+ - Implement: stderr logging helpers, consistent exit codes (0/2/3/4/5/6)
104
+
105
+ ### CLI commands (endpoints; sequential due to shared files)
106
+ - [x] T018 Implement `worktrees list` command
107
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`
108
+ - Wire: parse paging/filters; call service; print json/text
109
+ - [x] T019 Implement `worktrees create <NNN-kebab-feature>`
110
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`
111
+ - Wire: validate name; base detection/override; reuse/sibling flags; call service
112
+ - [x] T020 Implement `worktrees switch <name>`
113
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`
114
+ - Wire: allow dirty; warning to stderr; print current/previous
115
+ - [x] T021 Implement `worktrees remove <name>`
116
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`
117
+ - Wire: safety prechecks; `--delete-branch` with `--merged-into`; `--force` semantics
118
+ - [x] T022 Implement `worktrees status`
119
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`
120
+ - Wire: show current worktree ref
121
+
122
+ ## Phase 3.4: Integration
123
+ - [x] T023 Integrate safety checks and merge verification
124
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/src/services/worktree_service.sh`
125
+ - Implement: tracked changes, unpushed commits/no upstream, op in progress; `git merge-base --is-ancestor` for merged checks
126
+ - [x] T024 Wire global flags and output modes
127
+ - Files: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`, `/Users/drewgoddyn/projects/claude-worktrees/src/lib/io.sh`, `/Users/drewgoddyn/projects/claude-worktrees/src/lib/json.sh`
128
+ - Implement: `--help`, `--version`, `--format text|json` consistent across commands
129
+ - [x] T025 Implement global root resolution and setup
130
+ - Files: `/Users/drewgoddyn/projects/claude-worktrees/src/services/worktree_service.sh`, `/Users/drewgoddyn/projects/claude-worktrees/src/models/repository.sh`
131
+ - Implement: default `$HOME/.worktrees`, `WORKTREES_ROOT` and `--root` override; create if missing
132
+
133
+ ## Phase 3.5: Polish
134
+ - [x] T026 [P] Unit tests: FeatureName validation rules
135
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/unit/feature_name_test.bats`
136
+ - [x] T027 [P] Unit tests: default base detection
137
+ - File: `/Users/drewgoddyn/projects/claude-worktrees/tests/unit/repository_test.bats`
138
+ - [x] T028 [P] Implement list paging caps and performance guards
139
+ - Files: `/Users/drewgoddyn/projects/claude-worktrees/src/cli/worktrees`, `/Users/drewgoddyn/projects/claude-worktrees/src/services/worktree_service.sh`
140
+ - [x] T029 [P] Documentation pass
141
+ - Update quickstart examples in `/Users/drewgoddyn/projects/claude-worktrees/specs/001-build-a-tool/quickstart.md` and create README at `/Users/drewgoddyn/projects/claude-worktrees/README.md`
142
+ - [x] T030 [P] Ensure ShellCheck/shfmt clean, finalize Makefile targets
143
+ - Run `scripts/lint.sh` and `scripts/format.sh`; adjust code accordingly
144
+
145
+ ## Dependencies
146
+ - Setup (T001–T003) before Tests (T004–T010)
147
+ - Tests (T004–T010) must fail before Core (T011+)
148
+ - Models (T011–T014) before Services (T015–T017)
149
+ - Services/Libs (T015–T017) before CLI endpoints (T018–T022)
150
+ - Core (T011–T022) before Integration (T023–T025)
151
+ - Everything before Polish (T026–T030)
152
+ - CLI endpoint tasks T018–T022 are sequential (shared file `/src/cli/worktrees`)
153
+
154
+ ## Parallel Example
155
+ ```
156
+ # Launch T004–T010 together (different test files):
157
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/contract/cli_contracts.bats"
158
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/contract/openapi_worktrees.bats"
159
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/integration/create_worktree.bats"
160
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/integration/list_worktrees.bats"
161
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/integration/switch_worktree.bats"
162
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/integration/remove_keep_branch.bats"
163
+ Task: "Create /Users/drewgoddyn/projects/claude-worktrees/tests/integration/remove_delete_branch.bats"
164
+
165
+ # After models are done, run model tasks in parallel:
166
+ Task: "Implement /Users/drewgoddyn/projects/claude-worktrees/src/models/repository.sh"
167
+ Task: "Implement /Users/drewgoddyn/projects/claude-worktrees/src/models/feature_name.sh"
168
+ Task: "Implement /Users/drewgoddyn/projects/claude-worktrees/src/models/worktree.sh"
169
+ Task: "Implement /Users/drewgoddyn/projects/claude-worktrees/src/models/list_query.sh"
170
+ ```
171
+
172
+ ## Notes
173
+ - [P] tasks = different files, no dependencies
174
+ - Verify tests fail before implementing
175
+ - Commit after each task
176
+ - Avoid: vague tasks, same file conflicts
177
+
178
+ ## Task Generation Rules
179
+ *Applied during main() execution*
180
+
181
+ 1. **From Contracts**:
182
+ - Each contract file → contract test task [P]
183
+ - Each endpoint/CLI command → implementation task (sequential if shared files)
184
+
185
+ 2. **From Data Model**:
186
+ - Each entity → model creation task [P]
187
+ - Relationships → service layer tasks
188
+
189
+ 3. **From User Stories (quickstart flows)**:
190
+ - Each flow → integration test [P]
191
+ - Quickstart scenarios → validation tasks
192
+
193
+ 4. **Ordering**:
194
+ - Setup → Tests → Models → Services → Endpoints → Integration → Polish
195
+ - Dependencies block parallel execution
196
+
197
+ ## Validation Checklist
198
+ *GATE: Checked by main() before returning*
199
+
200
+ - [x] All contracts have corresponding tests (cli-contracts.md, openapi.yaml)
201
+ - [x] All entities have model tasks (Repository, FeatureName, Worktree, ListQuery)
202
+ - [x] All tests come before implementation
203
+ - [x] Parallel tasks truly independent
204
+ - [x] Each task specifies exact file path
205
+ - [x] No task modifies same file as another [P] task
206
+
207
+ **Validation Status**: ✅ PASSED - All spec-kit gates completed
208
+
209
+
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: worktrees
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Drew Goddyn
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-cli
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ description: A CLI tool to create, list, switch between, and remove Git feature worktrees
56
+ with safety checks and naming conventions
57
+ email:
58
+ - drgoddyn@gmail.com
59
+ executables:
60
+ - worktrees
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".claude/commands/plan.md"
65
+ - ".claude/commands/specify.md"
66
+ - ".claude/commands/tasks.md"
67
+ - ".cursor/commands/plan.md"
68
+ - ".cursor/commands/specify.md"
69
+ - ".cursor/commands/tasks.md"
70
+ - ".cursor/rules"
71
+ - ".specify/memory/constitution-v1.0.1-formal.md"
72
+ - ".specify/memory/constitution.md"
73
+ - ".specify/memory/constitution_update_checklist.md"
74
+ - ".specify/scripts/bash/check-task-prerequisites.sh"
75
+ - ".specify/scripts/bash/common.sh"
76
+ - ".specify/scripts/bash/create-new-feature.sh"
77
+ - ".specify/scripts/bash/get-feature-paths.sh"
78
+ - ".specify/scripts/bash/setup-plan.sh"
79
+ - ".specify/scripts/bash/update-agent-context.sh"
80
+ - ".specify/templates/agent-file-template.md"
81
+ - ".specify/templates/plan-template.md"
82
+ - ".specify/templates/spec-template.md"
83
+ - ".specify/templates/tasks-template.md"
84
+ - CLAUDE.md
85
+ - Gemfile
86
+ - Gemfile.lock
87
+ - README.md
88
+ - Rakefile
89
+ - exe/worktrees
90
+ - lib/worktrees.rb
91
+ - lib/worktrees/cli.rb
92
+ - lib/worktrees/commands/create.rb
93
+ - lib/worktrees/commands/list.rb
94
+ - lib/worktrees/commands/remove.rb
95
+ - lib/worktrees/commands/status.rb
96
+ - lib/worktrees/commands/switch.rb
97
+ - lib/worktrees/git_operations.rb
98
+ - lib/worktrees/models/feature_worktree.rb
99
+ - lib/worktrees/models/repository.rb
100
+ - lib/worktrees/models/worktree_config.rb
101
+ - lib/worktrees/version.rb
102
+ - lib/worktrees/worktree_manager.rb
103
+ - specs/001-build-a-tool/GEMINI.md
104
+ - specs/001-build-a-tool/contracts/cli-contracts.md
105
+ - specs/001-build-a-tool/contracts/openapi.yaml
106
+ - specs/001-build-a-tool/data-model.md
107
+ - specs/001-build-a-tool/plan.md
108
+ - specs/001-build-a-tool/quickstart.md
109
+ - specs/001-build-a-tool/research.md
110
+ - specs/001-build-a-tool/spec.md
111
+ - specs/001-build-a-tool/tasks.md
112
+ homepage: https://github.com/Drew-Goddyn/claude-worktrees
113
+ licenses:
114
+ - MIT
115
+ metadata:
116
+ homepage_uri: https://github.com/Drew-Goddyn/claude-worktrees
117
+ source_code_uri: https://github.com/Drew-Goddyn/claude-worktrees
118
+ changelog_uri: https://github.com/Drew-Goddyn/claude-worktrees/blob/main/CHANGELOG.md
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: 3.2.0
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubygems_version: 3.5.22
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Manage Git worktrees for feature-based development
138
+ test_files: []