git 4.3.2 → 5.0.0.beta.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.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +67 -2705
  3. data/.github/pull_request_template.md +3 -1
  4. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  5. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  6. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  7. data/.github/skills/command-implementation/SKILL.md +229 -0
  8. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  9. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  10. data/.github/skills/dependency-management/SKILL.md +72 -0
  11. data/.github/skills/development-workflow/SKILL.md +506 -0
  12. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  13. data/.github/skills/extract-facade-from-base-lib/SKILL.md +586 -0
  14. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  15. data/.github/skills/facade-implementation/SKILL.md +260 -0
  16. data/.github/skills/facade-test-conventions/SKILL.md +380 -0
  17. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  18. data/.github/skills/make-skill-template/SKILL.md +176 -0
  19. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  20. data/.github/skills/project-context/SKILL.md +313 -0
  21. data/.github/skills/pull-request-review/SKILL.md +168 -0
  22. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  23. data/.github/skills/release-management/SKILL.md +125 -0
  24. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  25. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  26. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  27. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  28. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  29. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  30. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  31. data/.github/skills/test-debugging/SKILL.md +160 -0
  32. data/.github/skills/yard-documentation/SKILL.md +793 -0
  33. data/.github/workflows/continuous_integration.yml +3 -2
  34. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  35. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  36. data/.github/workflows/release.yml +3 -4
  37. data/.gitignore +8 -0
  38. data/.husky/pre-commit +13 -0
  39. data/.release-please-manifest.json +1 -1
  40. data/.rspec +3 -0
  41. data/.rubocop.yml +7 -3
  42. data/.rubocop_todo.yml +23 -5
  43. data/.yardopts +1 -0
  44. data/CHANGELOG.md +0 -40
  45. data/CONTRIBUTING.md +694 -53
  46. data/README.md +17 -5
  47. data/Rakefile +61 -9
  48. data/commitlint.test +4 -0
  49. data/git.gemspec +14 -8
  50. data/lib/git/args_builder.rb +0 -8
  51. data/lib/git/base.rb +486 -410
  52. data/lib/git/branch.rb +380 -43
  53. data/lib/git/branch_delete_failure.rb +31 -0
  54. data/lib/git/branch_delete_result.rb +63 -0
  55. data/lib/git/branch_info.rb +178 -0
  56. data/lib/git/branches.rb +130 -24
  57. data/lib/git/command_line/base.rb +245 -0
  58. data/lib/git/command_line/capturing.rb +249 -0
  59. data/lib/git/command_line/result.rb +96 -0
  60. data/lib/git/command_line/streaming.rb +194 -0
  61. data/lib/git/command_line.rb +43 -322
  62. data/lib/git/command_line_result.rb +4 -88
  63. data/lib/git/commands/add.rb +131 -0
  64. data/lib/git/commands/am/abort.rb +43 -0
  65. data/lib/git/commands/am/apply.rb +252 -0
  66. data/lib/git/commands/am/continue.rb +43 -0
  67. data/lib/git/commands/am/quit.rb +43 -0
  68. data/lib/git/commands/am/retry.rb +47 -0
  69. data/lib/git/commands/am/show_current_patch.rb +64 -0
  70. data/lib/git/commands/am/skip.rb +42 -0
  71. data/lib/git/commands/am.rb +33 -0
  72. data/lib/git/commands/apply.rb +237 -0
  73. data/lib/git/commands/archive/list_formats.rb +46 -0
  74. data/lib/git/commands/archive.rb +140 -0
  75. data/lib/git/commands/arguments.rb +3510 -0
  76. data/lib/git/commands/base.rb +403 -0
  77. data/lib/git/commands/branch/copy.rb +94 -0
  78. data/lib/git/commands/branch/create.rb +173 -0
  79. data/lib/git/commands/branch/delete.rb +80 -0
  80. data/lib/git/commands/branch/list.rb +162 -0
  81. data/lib/git/commands/branch/move.rb +94 -0
  82. data/lib/git/commands/branch/set_upstream.rb +86 -0
  83. data/lib/git/commands/branch/show_current.rb +49 -0
  84. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  85. data/lib/git/commands/branch.rb +34 -0
  86. data/lib/git/commands/cat_file/batch.rb +364 -0
  87. data/lib/git/commands/cat_file/filtered.rb +105 -0
  88. data/lib/git/commands/cat_file/raw.rb +210 -0
  89. data/lib/git/commands/cat_file.rb +49 -0
  90. data/lib/git/commands/checkout/branch.rb +151 -0
  91. data/lib/git/commands/checkout/files.rb +115 -0
  92. data/lib/git/commands/checkout.rb +38 -0
  93. data/lib/git/commands/checkout_index.rb +105 -0
  94. data/lib/git/commands/clean.rb +100 -0
  95. data/lib/git/commands/clone.rb +240 -0
  96. data/lib/git/commands/commit.rb +272 -0
  97. data/lib/git/commands/commit_tree.rb +100 -0
  98. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  99. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  100. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  101. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  102. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  103. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  104. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +102 -0
  105. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  106. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  107. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  108. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  109. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  110. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  111. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  112. data/lib/git/commands/config_option_syntax.rb +56 -0
  113. data/lib/git/commands/describe.rb +155 -0
  114. data/lib/git/commands/diff.rb +656 -0
  115. data/lib/git/commands/diff_files.rb +518 -0
  116. data/lib/git/commands/diff_index.rb +496 -0
  117. data/lib/git/commands/fetch.rb +352 -0
  118. data/lib/git/commands/fsck.rb +136 -0
  119. data/lib/git/commands/gc.rb +132 -0
  120. data/lib/git/commands/grep.rb +338 -0
  121. data/lib/git/commands/init.rb +99 -0
  122. data/lib/git/commands/log.rb +632 -0
  123. data/lib/git/commands/ls_files.rb +191 -0
  124. data/lib/git/commands/ls_remote.rb +155 -0
  125. data/lib/git/commands/ls_tree.rb +131 -0
  126. data/lib/git/commands/maintenance/register.rb +75 -0
  127. data/lib/git/commands/maintenance/run.rb +104 -0
  128. data/lib/git/commands/maintenance/start.rb +66 -0
  129. data/lib/git/commands/maintenance/stop.rb +55 -0
  130. data/lib/git/commands/maintenance/unregister.rb +79 -0
  131. data/lib/git/commands/maintenance.rb +31 -0
  132. data/lib/git/commands/merge/abort.rb +44 -0
  133. data/lib/git/commands/merge/continue.rb +44 -0
  134. data/lib/git/commands/merge/quit.rb +46 -0
  135. data/lib/git/commands/merge/start.rb +245 -0
  136. data/lib/git/commands/merge.rb +28 -0
  137. data/lib/git/commands/merge_base.rb +86 -0
  138. data/lib/git/commands/mv.rb +77 -0
  139. data/lib/git/commands/name_rev.rb +114 -0
  140. data/lib/git/commands/pull.rb +377 -0
  141. data/lib/git/commands/push.rb +246 -0
  142. data/lib/git/commands/read_tree.rb +149 -0
  143. data/lib/git/commands/remote/add.rb +91 -0
  144. data/lib/git/commands/remote/get_url.rb +66 -0
  145. data/lib/git/commands/remote/list.rb +54 -0
  146. data/lib/git/commands/remote/prune.rb +61 -0
  147. data/lib/git/commands/remote/remove.rb +52 -0
  148. data/lib/git/commands/remote/rename.rb +69 -0
  149. data/lib/git/commands/remote/set_branches.rb +63 -0
  150. data/lib/git/commands/remote/set_head.rb +82 -0
  151. data/lib/git/commands/remote/set_url.rb +71 -0
  152. data/lib/git/commands/remote/set_url_add.rb +61 -0
  153. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  154. data/lib/git/commands/remote/show.rb +71 -0
  155. data/lib/git/commands/remote/update.rb +72 -0
  156. data/lib/git/commands/remote.rb +42 -0
  157. data/lib/git/commands/repack.rb +277 -0
  158. data/lib/git/commands/reset.rb +147 -0
  159. data/lib/git/commands/rev_parse.rb +297 -0
  160. data/lib/git/commands/revert/abort.rb +45 -0
  161. data/lib/git/commands/revert/continue.rb +57 -0
  162. data/lib/git/commands/revert/quit.rb +47 -0
  163. data/lib/git/commands/revert/skip.rb +44 -0
  164. data/lib/git/commands/revert/start.rb +153 -0
  165. data/lib/git/commands/revert.rb +29 -0
  166. data/lib/git/commands/rm.rb +114 -0
  167. data/lib/git/commands/show.rb +632 -0
  168. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  169. data/lib/git/commands/show_ref/exists.rb +78 -0
  170. data/lib/git/commands/show_ref/list.rb +145 -0
  171. data/lib/git/commands/show_ref/verify.rb +120 -0
  172. data/lib/git/commands/show_ref.rb +42 -0
  173. data/lib/git/commands/stash/apply.rb +75 -0
  174. data/lib/git/commands/stash/branch.rb +65 -0
  175. data/lib/git/commands/stash/clear.rb +41 -0
  176. data/lib/git/commands/stash/create.rb +58 -0
  177. data/lib/git/commands/stash/drop.rb +67 -0
  178. data/lib/git/commands/stash/list.rb +39 -0
  179. data/lib/git/commands/stash/pop.rb +78 -0
  180. data/lib/git/commands/stash/push.rb +103 -0
  181. data/lib/git/commands/stash/show.rb +149 -0
  182. data/lib/git/commands/stash/store.rb +63 -0
  183. data/lib/git/commands/stash.rb +38 -0
  184. data/lib/git/commands/status.rb +169 -0
  185. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  186. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  187. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  188. data/lib/git/commands/symbolic_ref.rb +38 -0
  189. data/lib/git/commands/tag/create.rb +139 -0
  190. data/lib/git/commands/tag/delete.rb +55 -0
  191. data/lib/git/commands/tag/list.rb +143 -0
  192. data/lib/git/commands/tag/verify.rb +71 -0
  193. data/lib/git/commands/tag.rb +26 -0
  194. data/lib/git/commands/update_ref/batch.rb +140 -0
  195. data/lib/git/commands/update_ref/delete.rb +92 -0
  196. data/lib/git/commands/update_ref/update.rb +106 -0
  197. data/lib/git/commands/update_ref.rb +42 -0
  198. data/lib/git/commands/version.rb +52 -0
  199. data/lib/git/commands/worktree/add.rb +140 -0
  200. data/lib/git/commands/worktree/list.rb +64 -0
  201. data/lib/git/commands/worktree/lock.rb +58 -0
  202. data/lib/git/commands/worktree/management_base.rb +51 -0
  203. data/lib/git/commands/worktree/move.rb +66 -0
  204. data/lib/git/commands/worktree/prune.rb +67 -0
  205. data/lib/git/commands/worktree/remove.rb +63 -0
  206. data/lib/git/commands/worktree/repair.rb +76 -0
  207. data/lib/git/commands/worktree/unlock.rb +47 -0
  208. data/lib/git/commands/worktree.rb +43 -0
  209. data/lib/git/commands/write_tree.rb +68 -0
  210. data/lib/git/commands.rb +89 -0
  211. data/lib/git/detached_head_info.rb +54 -0
  212. data/lib/git/diff.rb +297 -7
  213. data/lib/git/diff_file_numstat_info.rb +29 -0
  214. data/lib/git/diff_file_patch_info.rb +134 -0
  215. data/lib/git/diff_file_raw_info.rb +127 -0
  216. data/lib/git/diff_info.rb +169 -0
  217. data/lib/git/diff_path_status.rb +78 -19
  218. data/lib/git/diff_result.rb +32 -0
  219. data/lib/git/diff_stats.rb +59 -14
  220. data/lib/git/dirstat_info.rb +86 -0
  221. data/lib/git/errors.rb +65 -2
  222. data/lib/git/execution_context/global.rb +56 -0
  223. data/lib/git/execution_context/repository.rb +147 -0
  224. data/lib/git/execution_context.rb +482 -0
  225. data/lib/git/file_ref.rb +74 -0
  226. data/lib/git/fsck_object.rb +9 -9
  227. data/lib/git/fsck_result.rb +1 -1
  228. data/lib/git/lib.rb +1606 -1028
  229. data/lib/git/log.rb +15 -2
  230. data/lib/git/object.rb +92 -22
  231. data/lib/git/parsers/branch.rb +224 -0
  232. data/lib/git/parsers/cat_file.rb +111 -0
  233. data/lib/git/parsers/diff.rb +585 -0
  234. data/lib/git/parsers/fsck.rb +133 -0
  235. data/lib/git/parsers/grep.rb +42 -0
  236. data/lib/git/parsers/ls_tree.rb +58 -0
  237. data/lib/git/parsers/stash.rb +208 -0
  238. data/lib/git/parsers/tag.rb +257 -0
  239. data/lib/git/remote.rb +133 -9
  240. data/lib/git/repository/branching.rb +572 -0
  241. data/lib/git/repository/committing.rb +191 -0
  242. data/lib/git/repository/configuring.rb +156 -0
  243. data/lib/git/repository/diffing.rb +775 -0
  244. data/lib/git/repository/inspecting.rb +153 -0
  245. data/lib/git/repository/logging.rb +247 -0
  246. data/lib/git/repository/merging.rb +295 -0
  247. data/lib/git/repository/object_operations.rb +1101 -0
  248. data/lib/git/repository/path_resolver.rb +207 -0
  249. data/lib/git/repository/remote_operations.rb +753 -0
  250. data/lib/git/repository/shared_private.rb +51 -0
  251. data/lib/git/repository/staging.rb +390 -0
  252. data/lib/git/repository/stashing.rb +107 -0
  253. data/lib/git/repository/status_operations.rb +180 -0
  254. data/lib/git/repository/worktree_operations.rb +159 -0
  255. data/lib/git/repository.rb +264 -1
  256. data/lib/git/stash.rb +85 -4
  257. data/lib/git/stash_info.rb +104 -0
  258. data/lib/git/stashes.rb +130 -13
  259. data/lib/git/status.rb +224 -18
  260. data/lib/git/tag_delete_failure.rb +31 -0
  261. data/lib/git/tag_delete_result.rb +63 -0
  262. data/lib/git/tag_info.rb +105 -0
  263. data/lib/git/version.rb +109 -2
  264. data/lib/git/version_constraint.rb +81 -0
  265. data/lib/git/worktree.rb +120 -5
  266. data/lib/git/worktrees.rb +107 -7
  267. data/lib/git.rb +114 -18
  268. data/redesign/1_architecture_existing.md +54 -18
  269. data/redesign/2_architecture_redesign.md +365 -46
  270. data/redesign/3_architecture_implementation.md +1451 -54
  271. data/tasks/gem_tasks.rake +4 -0
  272. data/tasks/npm_tasks.rake +7 -0
  273. data/tasks/rspec.rake +48 -0
  274. data/tasks/test.rake +13 -1
  275. data/tasks/yard.rake +34 -7
  276. metadata +349 -20
  277. data/lib/git/index.rb +0 -6
  278. data/lib/git/path.rb +0 -38
  279. data/lib/git/working_directory.rb +0 -6
  280. /data/{release-please-config.json → .release-please-config.json} +0 -0
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: refactor-command-to-commandlineresult
3
+ description: "Migrates a command class that still performs parsing or custom execution logic to return raw Git::CommandLineResult, moving parsing to facade/parser layers. Use during architectural redesign refactoring."
4
+ ---
5
+
6
+ # Refactor Command to CommandLineResult
7
+
8
+ Migrate a command that still performs parsing or custom execution logic to the
9
+ `Git::Commands::Base` pattern, so command classes return raw
10
+ `Git::CommandLineResult` and parsing moves to facade/parser layers.
11
+
12
+ ## Contents
13
+
14
+ - [How to use this skill](#how-to-use-this-skill)
15
+ - [Prerequisites](#prerequisites)
16
+ - [Related skills](#related-skills)
17
+ - [Target end state](#target-end-state)
18
+ - [Refactor steps](#refactor-steps)
19
+ - [What to remove from command classes](#what-to-remove-from-command-classes)
20
+ - [What to update in tests](#what-to-update-in-tests)
21
+ - [YARD updates](#yard-updates)
22
+ - [Migration process and internal compatibility](#migration-process-and-internal-compatibility)
23
+
24
+ ## How to use this skill
25
+
26
+ Attach this file to your Copilot Chat context, then invoke it with the command
27
+ class or source file to migrate. Examples:
28
+
29
+ ```text
30
+ Using the Refactor Command to CommandLineResult skill, migrate
31
+ Git::Commands::Stash::Pop to the Base pattern.
32
+ ```
33
+
34
+ ```text
35
+ Refactor Command to CommandLineResult: lib/git/commands/branch/delete.rb
36
+ ```
37
+
38
+ The invocation needs the command class name or file path of the command to
39
+ refactor.
40
+
41
+ ## Prerequisites
42
+
43
+ Before starting, you **MUST** load the following skill(s) in their entirety:
44
+
45
+ - [YARD Documentation](../yard-documentation/SKILL.md) — authoritative
46
+ source for YARD formatting rules and writing standards;
47
+
48
+ ## Related skills
49
+
50
+ - [Command Implementation](../command-implementation/SKILL.md) — canonical class-shape checklist, phased
51
+ rollout gates, and internal compatibility contracts
52
+ - [Review Arguments DSL](../review-arguments-dsl/SKILL.md) — verifying DSL entries match git CLI
53
+ - [Command Test Conventions](../command-test-conventions/SKILL.md) — unit/integration test conventions for command classes
54
+ - [Review Backward Compatibility](../review-backward-compatibility/SKILL.md) — preserving `Git::Lib` return-value contracts
55
+
56
+ ## Target end state
57
+
58
+ ```ruby
59
+ class SomeCommand < Git::Commands::Base
60
+ arguments do
61
+ ...
62
+ end
63
+
64
+ # optional for non-zero successful exits
65
+ # rationale comment
66
+ # allow_exit_status 0..1
67
+
68
+ # @!method call(*, **)
69
+ #
70
+ # @overload call(**options)
71
+ #
72
+ # Execute the git ... command.
73
+ #
74
+ # @return [Git::CommandLineResult]
75
+ end
76
+ ```
77
+
78
+ ## Refactor steps
79
+
80
+ 1. Move parsing/transforming logic out of command class into caller/facade/parser.
81
+ 2. Replace legacy `ARGS` constant + custom `initialize` with `arguments do` +
82
+ inheritance from `Base`.
83
+ 3. Remove custom `#call` body and add `# @!method call(*, **)` YARD directive.
84
+ 4. If command requires non-default success exits, add `allow_exit_status` with
85
+ rationale comment.
86
+ 5. Update callers to consume `CommandLineResult` and parse `result.stdout` where
87
+ needed.
88
+
89
+ ## What to remove from command classes
90
+
91
+ - parser invocations
92
+ - output transformation logic
93
+ - `literal` entries for policy/output-control flags (e.g. `literal '--no-edit'`,
94
+ `literal '--verbose'`, `literal '--no-progress'`, `literal '--no-color'`) —
95
+ command classes are neutral, faithful representations of the git CLI; convert to
96
+ `flag_option` / `value_option` so the facade can pass the policy value. See
97
+ "Command-layer neutrality" in CONTRIBUTING.md.
98
+ - manual `raise_on_failure` / manual exit-code checks (unless temporarily needed in
99
+ an unmigrated class)
100
+ - duplicated bind/execute logic
101
+
102
+ ## What to update in tests
103
+
104
+ - unit specs should assert CLI args and `CommandLineResult` behavior
105
+ - remove parsed-object assertions from command unit specs
106
+ - move parsing expectations to parser/facade tests
107
+ - include `raise_on_failure: false` in mocked command expectations
108
+
109
+ ## YARD updates
110
+
111
+ - update `@return` to `Git::CommandLineResult`
112
+ - keep command-specific `@overload` docs nested under `# @!method call(*, **)` directive
113
+ - ensure `@raise` wording reflects allowed range behavior
114
+ - tag short descriptions must not end with punctuation (no trailing period, comma,
115
+ or colon)
116
+ - multi-paragraph tag descriptions must have a blank comment line (`#`) between the
117
+ short description and each continuation paragraph
118
+
119
+ ## Migration process and internal compatibility
120
+
121
+ See [Command Implementation](../command-implementation/SKILL.md) for the canonical phased rollout checklist
122
+ and internal compatibility contract. In summary:
123
+
124
+ - **always work on a feature branch** — never commit or push directly to `main`;
125
+ create a branch before starting (`git checkout -b <feature-branch-name>`) and
126
+ open a pull request when the slice is ready
127
+ - perform refactor in phased slices (pilot/family)
128
+ - keep each slice independently revertible
129
+ - do not mix unrelated behavior changes with refactor-only changes
130
+ - pass slice gates: `bundle exec rspec`, `bundle exec rake test`,
131
+ `bundle exec rubocop`, `bundle exec rake yard`
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: release-management
3
+ description: "Prepares and publishes new releases of the ruby-git gem including version bumps, changelog updates, tagging, and gem publishing. Use when preparing a release or checking release readiness."
4
+ ---
5
+
6
+ # Release Management Workflow
7
+
8
+ This workflow describes how releases are managed for the ruby-git gem.
9
+
10
+ ## Contents
11
+
12
+ - [How to use this skill](#how-to-use-this-skill)
13
+ - [Related skills](#related-skills)
14
+ - [How Releases Work](#how-releases-work)
15
+ - [Developer Responsibilities](#developer-responsibilities)
16
+ - [Checking Release Readiness](#checking-release-readiness)
17
+ - [What NOT to Do](#what-not-to-do)
18
+ - [Useful Commands](#useful-commands)
19
+
20
+ ## How to use this skill
21
+
22
+ Attach this file to your Copilot Chat context when preparing a release, verifying
23
+ release readiness, or answering questions about versioning and publishing flow.
24
+
25
+ ## Related skills
26
+
27
+ - [Dependency Management](../dependency-management/SKILL.md) — dependency updates
28
+ that affect release content and risk
29
+ - [PR Readiness Review](../pr-readiness-review/SKILL.md) — ensure changes are
30
+ release-ready before merge
31
+ - [Breaking Change Analysis](../breaking-change-analysis/SKILL.md) — evaluate and
32
+ communicate major-version impact
33
+
34
+ ## How Releases Work
35
+
36
+ Releases are **fully automated** via
37
+ [release-please](https://github.com/googleapis/release-please) and the
38
+ `.github/workflows/release.yml` workflow:
39
+
40
+ 1. Developers merge PRs with **conventional commit** messages into `main`
41
+ 2. release-please automatically opens (and keeps updated) a **release PR** that
42
+ bumps `lib/git/version.rb` and regenerates `CHANGELOG.md`
43
+ 3. When a maintainer merges the release PR, release-please creates a **GitHub
44
+ release** with a tag
45
+ 4. The workflow then **publishes the gem** to RubyGems.org via `rubygems/release-gem`
46
+
47
+ Key config files:
48
+
49
+ | File | Purpose |
50
+ | ---- | ------- |
51
+ | `.release-please-config.json` | Release-please settings (release type, changelog sections, versioning strategy) |
52
+ | `.release-please-manifest.json` | Tracks the current released version |
53
+ | `lib/git/version.rb` | Version constant (updated automatically by release-please) |
54
+ | `CHANGELOG.md` | Release history (updated automatically by release-please) |
55
+
56
+ The versioning strategy is `prerelease` with `beta` as the prerelease type. The
57
+ config also sets `bump-minor-pre-major: true` and `bump-patch-for-minor-pre-major: true`.
58
+
59
+ ## Developer Responsibilities
60
+
61
+ The only thing developers need to do for releases is **use conventional commit
62
+ messages**. release-please determines the version bump from commit types:
63
+
64
+ - `fix:` → **patch** bump
65
+ - `feat:` → **minor** bump
66
+ - `feat!:` or `BREAKING CHANGE:` footer → **major** bump
67
+
68
+ Everything else (version bump, changelog, tag, gem push) is automated. Do **not**
69
+ manually edit `lib/git/version.rb` or `CHANGELOG.md`.
70
+
71
+ ## Checking Release Readiness
72
+
73
+ Before a maintainer merges a release PR:
74
+
75
+ 1. **Ensure CI passes on `main`:**
76
+
77
+ ```bash
78
+ bundle exec rake default
79
+ ```
80
+
81
+ 2. **Review unreleased changes since last tag:**
82
+
83
+ ```bash
84
+ git log $(git describe --tags --abbrev=0)..HEAD --oneline
85
+ ```
86
+
87
+ 3. **Check for open blockers:**
88
+
89
+ ```bash
90
+ gh issue list --label "bug" --state open
91
+ ```
92
+
93
+ 4. **Review the release PR** — verify the auto-generated changelog and version
94
+ bump look correct.
95
+
96
+ ## What NOT to Do
97
+
98
+ - Do **not** manually bump `lib/git/version.rb` — release-please does this
99
+ - Do **not** manually edit `CHANGELOG.md` — it is auto-generated from commits
100
+ - Do **not** manually create tags — release-please creates them on merge
101
+ - Do **not** manually `gem push` — the workflow handles publishing
102
+ - Do **not** force-push or rebase the release PR — release-please manages it
103
+
104
+ ## Useful Commands
105
+
106
+ ```bash
107
+ # View recent tags
108
+ git tag -l --sort=-v:refname | head -10
109
+
110
+ # List commits since last release
111
+ git log $(git describe --tags --abbrev=0)..HEAD --oneline
112
+
113
+ # Compare with previous release
114
+ git diff $(git describe --tags --abbrev=0)..HEAD
115
+
116
+ # Check current version
117
+ ruby -e "require_relative 'lib/git/version'; puts Git::VERSION"
118
+
119
+ # View release-please config
120
+ cat .release-please-config.json | jq .
121
+
122
+ # Build gem locally (for testing only)
123
+ bundle exec rake build
124
+ gem install pkg/git-*.gem
125
+ ```