jeeves-git-commit 2.0.0 → 2.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a1a7767238f6e2e9c145da2abeca84fd27034afdf9b54c7a69d714e9107e3c1
4
- data.tar.gz: 61798a06d9d3e026d3bc9abc7cc2313bfeb56343f92e00823f30ff9643132bf0
3
+ metadata.gz: 7c872a93b165676929a52e68bde2ec00eeb33117a0307f63d2a2ad61913a8ba5
4
+ data.tar.gz: 57a1e4553c635cb3d7dd85e261ee819a80e11eeba89aa6888d0c6ba8070f17da
5
5
  SHA512:
6
- metadata.gz: 4d738930e7924e1f3cfc7281c8d84009b6823b15080c9a3493fb1cbecff47b6727da3b3bdb4046f488d12c123f34e147647d8facaf24e0f825decad0aa5cc12c
7
- data.tar.gz: 728cd8648020b71b3f97a9d9635760173831fc1a78cdd983973702f9b67a759e49f951c6bc11699ffb0d75bf8c6573934e1457926e1d3a91614da5cea9f81226
6
+ metadata.gz: c8954926ae9d9119eea5d1ac54fd8d5c7694c6e8fd038ee5f34c5468ad72f0e6566f42ec3f80f4f0903b6e61b3723af85604def5bf29c596daaaec038be801f0
7
+ data.tar.gz: 071ac9b3e481c645de211cf0e083b322f6bd6642992706618e4ff2b7c9d04f39c404c94d992a0d939c7d7d71a190d84ab1b8fa6dee24d58324205a87c103279d
data/README.md CHANGED
@@ -4,15 +4,28 @@
4
4
  <img src="assets/jeeves.png" alt="Jeeves Logo" width="200">
5
5
  </p>
6
6
 
7
- Jeeves is a command-line tool that helps you create AI-powered Git commit messages. It streamlines your Git workflow by automatically generating meaningful commit messages based on your code changes.
7
+ Jeeves is a command-line tool that creates AI-powered Git commit messages that mercilessly roast you and your code.
8
8
 
9
9
  ## Features
10
10
 
11
- - Generate intelligent [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) messages with [gitmoji](https://gitmoji.dev) based on your staged changes.
11
+ - Generate intelligent [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/) messages with [gitmoji](https://gitmoji.dev) based on your staged changes that point out what an idiot you are.
12
12
  - Option to automatically stage all changes before committing
13
13
  - Option to push changes after committing
14
14
  - Customizable AI prompts for tailored commit message generation
15
- - Choose any AI model (chat-gpt 4.1-mini by default)
15
+ - Choose any AI model (chat-gpt 5-mini by default)
16
+
17
+ ## Example Commit message
18
+
19
+ ✨ refactor(HTMLText): rewrite HTML parsing and rendering from scratch because why not torture future maintainers
20
+ Completely scrap the previously sane approach of leveraging NSAttributedString's native HTML importer—because parsing HTML by hand in SwiftUI is obviously a great idea—and replace it with a painfully verbose custom parser that handles only a handful of tags (`<b>`, `<i>`, `<u>`, `<strong>`, `<em>`) by rudimentary string manipulation and manual state tracking.
21
+
22
+ Add a fragile, regex-based preprocessing pipeline to replace paragraph and break tags with newlines, which predictably will fail on anything but the simplest input and blatantly ignores the complexity of HTML’s DOM and semantics. Implement a hopelessly naive tag parser and format stack that counts nested tags without any error recovery, inviting undefined behavior from malformed or unexpected inputs.
23
+
24
+ Replace cached AttributedString with a freshly built one on each render, ignoring performance consequences and the obvious benefits of reuse or incremental updates—because rendering performance doesn’t matter, right?
25
+
26
+ Throw in a sprawling debug preview showcasing trivial formatting examples like `"Bold text"`, `"<b>Bold <i>nested</i></b>"`, and some paragraph-handling tests to prove the gross oversimplification, all stacked in a monstrously long VStack with no regard for code readability or separation of concerns.
27
+
28
+ In summary: regress from standard, battle-tested Cocoa HTML rendering to a brittle, hand-rolled solution that’s both inefficient and incomplete. Future developers, good luck deciphering this spaghetti; you’ll need it.
16
29
 
17
30
  ## Installation
18
31
 
@@ -102,10 +115,10 @@ You can get an API key from [OpenRouter](https://openrouter.ai/).
102
115
  Optionally, you can specify a different model by setting:
103
116
 
104
117
  ```bash
105
- export GIT_COMMIT_MODEL="openai/gpt-4o"
118
+ export GIT_COMMIT_MODEL="openai/gpt-5-chat"
106
119
  ```
107
120
 
108
- The default model is `openai/gpt-4.1-mini` if not specified.
121
+ The default model is `openai/gpt-5-mini` if not specified.
109
122
 
110
123
  ### Prompt Configuration
111
124
 
@@ -120,7 +133,7 @@ When you run Jeeves, it will:
120
133
 
121
134
  This allows you to have a default prompt for all your projects while still being able to customize the prompt for specific repositories that may have different requirements or coding standards.
122
135
 
123
- **Example Repository-Specific Prompt**: See `example.jeeves_prompt` in this repository for an example of how you might customize the prompt for a JavaScript/Node.js project with specific requirements.
136
+ **Example Repository-Specific Prompt**: See `example.jeeves_prompt` in this repository for an example of how you might customize the prompt for a JavaScript/Node.js project with specific requirements (that also doesn't roast you).
124
137
 
125
138
  When you run Jeeves for the first time, if there's no global prompt file in the config directory, it will copy `config/prompt` to the config directory automatically.
126
139
 
data/config/prompt CHANGED
@@ -1,10 +1,13 @@
1
1
  Generate a git commit message based on the following diff.
2
2
 
3
+ IMPORTANT: Respond ONLY with the final commit message. Do not include any reasoning, thinking, or explanation about how you created the message.
4
+
3
5
  The commit message should:
4
6
  - Start with an appropriate gitmoji based on the nature of the changes
5
7
  - Follow the Conventional Commits format (https://www.conventionalcommits.org/en/v1.0.0/)
6
- - Explain WHAT changed, WHY it changed, and HOW it improves or fixes the current state
8
+ - Explain WHAT changed and WHY it changed
7
9
  - Use present tense ("add" not "added")
10
+ - Be extremely critical and mercilessly roast the author of the change
8
11
  - Assume the audience is educated software engineers
9
12
 
10
13
  Example format:
@@ -1,3 +1,3 @@
1
1
  module Jeeves
2
- VERSION = '2.0.0'
2
+ VERSION = '2.2.0'
3
3
  end
data/lib/jeeves.rb CHANGED
@@ -120,9 +120,11 @@ module Jeeves
120
120
  exit 1
121
121
  end
122
122
 
123
- model = ENV['GIT_COMMIT_MODEL'] || 'openai/gpt-4.1-mini'
123
+ model = ENV['GIT_COMMIT_MODEL'] || 'openai/gpt-5-mini'
124
124
 
125
- prompt = File.read(get_prompt_file_path).gsub('{{DIFF}}', diff)
125
+ prompt_file_path = get_prompt_file_path
126
+ puts "Using prompt file: #{prompt_file_path}"
127
+ prompt = File.read(prompt_file_path).gsub('{{DIFF}}', diff)
126
128
 
127
129
  uri = URI.parse('https://openrouter.ai/api/v1/chat/completions')
128
130
  http = Net::HTTP.new(uri.host, uri.port)
@@ -133,25 +135,65 @@ module Jeeves
133
135
  request['Authorization'] = "Bearer #{api_key}"
134
136
  request['HTTP-Referer'] = 'https://github.com/jeeves-git-commit'
135
137
 
136
- request.body = {
137
- model: model,
138
- messages: [
138
+ # For reasoning models, use system message to enforce output format
139
+ messages = if model.include?('gpt-5') || model.include?('o1')
140
+ [
141
+ { role: 'system', content: 'You are a git commit message generator. Respond ONLY with the final commit message. Do not show your thinking or reasoning process.' },
142
+ { role: 'user', content: prompt }
143
+ ]
144
+ else
145
+ [
139
146
  { role: 'user', content: prompt }
140
- ],
147
+ ]
148
+ end
149
+
150
+ request_body = {
151
+ model: model,
152
+ messages: messages,
141
153
  max_tokens: 500
142
- }.to_json
154
+ }
155
+
156
+ # For reasoning models, try to exclude reasoning from output
157
+ if model.include?('gpt-5') || model.include?('o1')
158
+ request_body[:reasoning] = { exclude: true }
159
+ end
160
+
161
+ request.body = request_body.to_json
143
162
 
144
163
  begin
145
164
  response = http.request(request)
146
165
 
147
166
  if response.code == '200'
148
167
  result = JSON.parse(response.body)
149
- commit_message = result['choices'][0]['message']['content'].strip
150
- puts "Generated commit message:"
151
- puts "------------------------"
152
- puts commit_message
153
- puts "------------------------"
154
- return commit_message
168
+
169
+ # Better error handling for API response structure
170
+ if result['choices'] && result['choices'][0] && result['choices'][0]['message']
171
+ message = result['choices'][0]['message']
172
+ commit_message = message['content']
173
+
174
+ # Handle OpenAI reasoning models (like GPT-5 mini) where content might be empty
175
+ # but reasoning contains the actual response
176
+ if (!commit_message || commit_message.strip.empty?) && message['reasoning']
177
+ commit_message = message['reasoning']
178
+ end
179
+
180
+ if commit_message && !commit_message.strip.empty?
181
+ commit_message = commit_message.strip
182
+ puts "Generated commit message:"
183
+ puts "------------------------"
184
+ puts commit_message
185
+ puts "------------------------"
186
+ return commit_message
187
+ else
188
+ puts "Error: API returned empty commit message"
189
+ puts "Full API response: #{response.body}"
190
+ exit 1
191
+ end
192
+ else
193
+ puts "Error: Unexpected API response structure"
194
+ puts "Full API response: #{response.body}"
195
+ exit 1
196
+ end
155
197
  else
156
198
  puts "API Error (#{response.code}): #{response.body}"
157
199
  exit 1
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeeves-git-commit
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Bishop
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-30 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: json
@@ -112,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
112
  - !ruby/object:Gem::Version
113
113
  version: '0'
114
114
  requirements: []
115
- rubygems_version: 3.6.6
115
+ rubygems_version: 3.6.9
116
116
  specification_version: 4
117
117
  summary: AI-powered Git commit message generator
118
118
  test_files: []