claude-git-hooks 2.4.1 → 2.6.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.
- package/CHANGELOG.md +364 -150
- package/README.md +128 -40
- package/bin/claude-hooks +436 -2
- package/lib/config.js +29 -0
- package/lib/hooks/pre-commit.js +2 -6
- package/lib/hooks/prepare-commit-msg.js +27 -4
- package/lib/utils/claude-client.js +261 -136
- package/lib/utils/file-operations.js +0 -102
- package/lib/utils/github-api.js +641 -0
- package/lib/utils/github-client.js +770 -0
- package/lib/utils/interactive-ui.js +314 -0
- package/lib/utils/mcp-setup.js +342 -0
- package/lib/utils/sanitize.js +180 -0
- package/lib/utils/task-id.js +441 -0
- package/lib/utils/which-command.js +225 -0
- package/package.json +10 -1
- package/templates/CREATE_GITHUB_PR.md +32 -0
- package/templates/config.github.example.json +51 -0
- package/templates/presets/ai/PRE_COMMIT_GUIDELINES.md +18 -1
- package/templates/presets/ai/preset.json +37 -37
- package/templates/settings.local.example.json +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,26 +5,232 @@ Todos los cambios notables en este proyecto se documentarán en este archivo.
|
|
|
5
5
|
El formato está basado en [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.6.0] - 2025-12-02
|
|
9
|
+
|
|
10
|
+
### ✨ Added - Node.js 24 Compatibility
|
|
11
|
+
|
|
12
|
+
- **Full Node.js 24 Support** - claude-hooks now compatible with Node.js 24 without deprecation warnings
|
|
13
|
+
- **What changed**: Removed `shell: true` from `spawn()` calls to avoid DEP0190 deprecation
|
|
14
|
+
- **Why**: Node.js 24 deprecates passing args array to `spawn()` with `shell: true` due to security risks (shell injection)
|
|
15
|
+
- **Solution**: New `which-command.js` utility resolves executable paths without shell
|
|
16
|
+
- **Impact**: No DEP0190 warnings, more secure execution, works on Node 16-24+
|
|
17
|
+
|
|
18
|
+
- **New Utility Module**: `lib/utils/which-command.js`
|
|
19
|
+
- **Purpose**: Cross-platform executable path resolution (like Unix `which`, Windows `where`)
|
|
20
|
+
- **Key Features**:
|
|
21
|
+
- Finds executables in PATH without `shell: true`
|
|
22
|
+
- Handles Windows `.exe/.cmd/.bat` extensions automatically
|
|
23
|
+
- Platform-agnostic API (`which()`, `whichOrThrow()`, `hasCommand()`)
|
|
24
|
+
- Fast: tries platform command first, fallback to manual PATH search
|
|
25
|
+
- Secure: no shell invocation needed
|
|
26
|
+
- **Exports**: `which()`, `whichOrThrow()`, `hasCommand()`
|
|
27
|
+
- **Tests**: 11 tests covering Unix/Windows scenarios
|
|
28
|
+
|
|
29
|
+
### 🔄 Changed
|
|
30
|
+
|
|
31
|
+
- **`claude-client.js` - Updated Command Resolution**
|
|
32
|
+
- **Line 25**: Added `import { which } from './which-command.js'`
|
|
33
|
+
- **Lines 77-143**: Refactored `getClaudeCommand()` to use `which()` for absolute paths
|
|
34
|
+
- Windows: resolves `claude.exe` or `wsl.exe` absolute path
|
|
35
|
+
- Unix: resolves `claude` absolute path
|
|
36
|
+
- Fallback: returns 'claude' if which() fails (will error later if not in PATH)
|
|
37
|
+
- **Lines 181-183**: **Removed `shell: true`** from `spawn()` call
|
|
38
|
+
- **Before**: `spawn(command, args, { shell: true })`
|
|
39
|
+
- **After**: `spawn(command, args, { stdio: [...] })`
|
|
40
|
+
- **Why**: Avoids DEP0190, improves security, works on Node 24
|
|
41
|
+
- **Impact**: Claude CLI execution now uses absolute paths, no shell overhead
|
|
42
|
+
|
|
43
|
+
- **`package.json` - Platform Documentation**
|
|
44
|
+
- **Lines 36-41**: Added `engineStrict: false` and `os` array
|
|
45
|
+
- **Why**: Documents supported platforms (darwin, linux, win32)
|
|
46
|
+
- **No breaking change**: Still supports Node >= 16.9.0
|
|
47
|
+
|
|
48
|
+
### 🧪 Testing
|
|
49
|
+
|
|
50
|
+
- **New Test Suite**: `test/unit/claude-client-node24.test.js`
|
|
51
|
+
- 8 tests covering Node 24 compatibility
|
|
52
|
+
- Verifies `getClaudeCommand()` returns absolute paths
|
|
53
|
+
- Checks DEP0190 is not triggered
|
|
54
|
+
- Platform detection tests (Windows/WSL/Unix)
|
|
55
|
+
|
|
56
|
+
- **New Test Suite**: `test/unit/which-command.test.js`
|
|
57
|
+
- 11 tests for executable resolution
|
|
58
|
+
- Verifies no DEP0190 warnings
|
|
59
|
+
- Tests `which()`, `whichOrThrow()`, `hasCommand()`
|
|
60
|
+
- Cross-platform compatibility checks
|
|
61
|
+
|
|
62
|
+
- **All Tests Pass**: 51 passed (Node 24 migration), 7 failed (pre-existing task-id issues)
|
|
63
|
+
|
|
64
|
+
### 📚 Documentation
|
|
65
|
+
|
|
66
|
+
- **New Migration Guide**: `MIGRATION_NODE24.md`
|
|
67
|
+
- Comprehensive 400+ line document
|
|
68
|
+
- Explains DEP0190 deprecation in detail
|
|
69
|
+
- Step-by-step migration plan
|
|
70
|
+
- Testing strategy across Node 16/18/20/24
|
|
71
|
+
- Platform test matrix (Windows/WSL/Linux/macOS)
|
|
72
|
+
- Rollback plan if issues arise
|
|
73
|
+
- References to Node.js GitHub issues and PRs
|
|
74
|
+
|
|
75
|
+
### 🔧 Technical Details
|
|
76
|
+
|
|
77
|
+
**DEP0190 Explanation**:
|
|
78
|
+
- **What**: Node.js 24 deprecates `spawn(cmd, args, { shell: true })`
|
|
79
|
+
- **Why**: Args are not escaped, just concatenated → shell injection risk
|
|
80
|
+
- **Fix**: Use absolute executable paths, remove `shell: true`
|
|
81
|
+
|
|
82
|
+
**Files Changed**:
|
|
83
|
+
- `lib/utils/claude-client.js` - Command resolution and spawn call
|
|
84
|
+
- `lib/utils/which-command.js` - NEW utility for path resolution
|
|
85
|
+
- `package.json` - Platform documentation
|
|
86
|
+
- `test/unit/claude-client-node24.test.js` - NEW tests
|
|
87
|
+
- `test/unit/which-command.test.js` - NEW tests
|
|
88
|
+
- `MIGRATION_NODE24.md` - NEW migration guide
|
|
89
|
+
|
|
90
|
+
**Backward Compatibility**:
|
|
91
|
+
- ✅ Works on Node 16.9.0+ (unchanged)
|
|
92
|
+
- ✅ Works on Node 18 (unchanged)
|
|
93
|
+
- ✅ Works on Node 20 (unchanged)
|
|
94
|
+
- ✅ Works on Node 24 (NEW - no warnings)
|
|
95
|
+
- ✅ No API changes
|
|
96
|
+
- ✅ No behavioral changes
|
|
97
|
+
|
|
98
|
+
### 🎯 User Experience
|
|
99
|
+
|
|
100
|
+
- **No Action Required**: Upgrade works transparently
|
|
101
|
+
- **No Warnings**: Clean execution on Node 24
|
|
102
|
+
- **Better Security**: No shell injection risk
|
|
103
|
+
- **Faster**: No shell overhead (small performance gain)
|
|
104
|
+
- **Same API**: All commands work identically
|
|
105
|
+
|
|
106
|
+
### 📋 Migration Checklist
|
|
107
|
+
|
|
108
|
+
For users on Node 24:
|
|
109
|
+
- [x] Update to claude-git-hooks 2.6.0
|
|
110
|
+
- [x] Verify no DEP0190 warnings: `claude-hooks install`
|
|
111
|
+
- [x] Test pre-commit hook: `git commit`
|
|
112
|
+
- [x] Test GitHub setup: `claude-hooks setup-github`
|
|
113
|
+
|
|
114
|
+
### 🔗 References
|
|
115
|
+
|
|
116
|
+
- [Node.js DEP0190 Documentation](https://nodejs.org/api/deprecations.html#dep0190-passing-args-to-spawn-with-shell-true)
|
|
117
|
+
- [GitHub Issue #58763 - DEP0190 not fixable with stdio](https://github.com/nodejs/node/issues/58763)
|
|
118
|
+
- [PR #57199 - Disallow args with shell: true](https://github.com/nodejs/node/pull/57199)
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## [2.5.0] - 2025-11-26
|
|
123
|
+
|
|
124
|
+
### ✨ Added
|
|
125
|
+
|
|
126
|
+
- **GitHub Integration - One-Command PR Creation** - Create pull requests with auto-generated metadata
|
|
127
|
+
- **What's new**: `claude-hooks create-pr [base]` command that creates PRs on GitHub via Octokit (deterministic)
|
|
128
|
+
- **Architecture**: Claude analyzes diff and generates metadata (brain) → Octokit creates PR (deterministic actions)
|
|
129
|
+
- **Key features**:
|
|
130
|
+
- **Task-ID Extraction**: Automatically extracts task identifiers from branch names (Jira: IX-123, GitHub: #456, Linear: LIN-123)
|
|
131
|
+
- **Smart PR Generation**: Claude analyzes git diff and generates PR title, description, reviewers, and labels
|
|
132
|
+
- **Deterministic Creation**: Octokit directly creates PR via GitHub REST API (no MCP dependencies)
|
|
133
|
+
- **Token Management**: 4-level priority (GITHUB_TOKEN env → GITHUB_PERSONAL_ACCESS_TOKEN env → .claude/settings.local.json → Claude Desktop config)
|
|
134
|
+
- **Auto-Reviewer Detection**: Detects reviewers from CODEOWNERS file, config patterns, or preset-based rules
|
|
135
|
+
- **Preset-Based Labels**: Automatically adds labels based on tech stack (backend → java/spring-boot, frontend → react/typescript)
|
|
136
|
+
- **Interactive Preview**: Shows formatted PR preview with confirmation before creating
|
|
137
|
+
- **Configurable Defaults**: Set default base branch, reviewers, labels, and rules in `.claude/config.json`
|
|
138
|
+
- **Error Recovery**: Saves PR metadata to .claude/out/pr-metadata.json on failure for manual retry
|
|
139
|
+
- **Task-ID in Commits**: Auto-detect task-id from branch when using `git commit -m "auto"` with configurable regex pattern
|
|
140
|
+
- **Task-ID Pattern (Configurable)**:
|
|
141
|
+
- **Default**: 1-3 uppercase letters + separator + 3-5 digits (e.g., ABC-12345, IX-123, DE 4567)
|
|
142
|
+
- **Config**: Set custom regex in `.claude/config.json` → `commitMessage.taskIdPattern`
|
|
143
|
+
- **Avoids false positives**: Won't match hashes (471459f), invalid formats (ABCD-123, IX-12)
|
|
144
|
+
- **Examples**: `([A-Z]{1,3}[-\\s]\\d{3,5})` (default), `([A-Z]{2,10}-\\d+)` (Jira-style)
|
|
145
|
+
- **New modules**:
|
|
146
|
+
- `lib/utils/task-id.js` - Reusable task-id extraction and formatting (29 tests)
|
|
147
|
+
- `lib/utils/github-api.js` - Direct Octokit integration (token resolution, PR creation, validation)
|
|
148
|
+
- `lib/utils/github-client.js` - GitHub MCP wrapper (deprecated, kept for compatibility)
|
|
149
|
+
- `lib/utils/interactive-ui.js` - Terminal UI helpers (preview, prompts, menus, spinners)
|
|
150
|
+
- **Configuration**: New `github.pr` section in config with reviewers, labels, and pattern rules
|
|
151
|
+
- **Files created**:
|
|
152
|
+
- `lib/utils/task-id.js` - Task ID extraction/formatting
|
|
153
|
+
- `lib/utils/github-api.js` - Octokit integration with token resolution
|
|
154
|
+
- `lib/utils/github-client.js` - GitHub MCP client wrapper (deprecated)
|
|
155
|
+
- `lib/utils/interactive-ui.js` - Interactive CLI components
|
|
156
|
+
- `templates/config.github.example.json` - Example GitHub configuration
|
|
157
|
+
- `templates/settings.local.example.json` - Local token storage template
|
|
158
|
+
- **Files updated**:
|
|
159
|
+
- `bin/claude-hooks:1044-1377` - Rewritten createPr() function with 13-step Octokit workflow
|
|
160
|
+
- `bin/claude-hooks:1299-1344` - New setupGitHub() function
|
|
161
|
+
- `bin/claude-hooks:1772-1774` - Added setup-github case statement
|
|
162
|
+
- `bin/claude-hooks:1515,1537-1548` - Updated help with token configuration
|
|
163
|
+
- `bin/claude-hooks:488-490` - Added GitHub PR creation to post-install message
|
|
164
|
+
- `lib/config.js:37-46` - Added commitMessage.taskIdPattern configuration
|
|
165
|
+
- `lib/config.js:81-102` - Simplified GitHub config, enabled by default
|
|
166
|
+
- `lib/utils/github-client.js:792-794` - Deprecation notice for MCP-based createPullRequest
|
|
167
|
+
- `lib/utils/task-id.js:21-55,71-98,107-144` - Made pattern configurable, reads from config
|
|
168
|
+
- `lib/hooks/prepare-commit-msg.js:27,182-193,280-290` - Added task-id detection with config support
|
|
169
|
+
- `package.json` - Added @octokit/rest ^21.0.0 dependency
|
|
170
|
+
- **Requirements**:
|
|
171
|
+
- GitHub token with repo and read:org scopes
|
|
172
|
+
- Repository must have GitHub remote origin
|
|
173
|
+
- **Token configuration**: `claude-hooks setup-github` guides through token setup
|
|
174
|
+
- **Comprehensive logging**: Debug logs throughout github-api.js and createPr() for troubleshooting
|
|
175
|
+
- **Dynamic user agent**: Version read from package.json to prevent staleness
|
|
176
|
+
- **Task-ID Detection**: Auto-extract or prompt for task-id in commit messages (Jira, GitHub, Linear)
|
|
177
|
+
- **Impact**: Developers can create well-formatted PRs with proper metadata in one command, reducing PR creation friction
|
|
178
|
+
|
|
179
|
+
### 🎯 User Experience
|
|
180
|
+
|
|
181
|
+
- **One-Command Workflow**: `claude-hooks create-pr develop` replaces manual PR creation steps
|
|
182
|
+
- **Deterministic & Reliable**: Octokit provides consistent PR creation (no MCP reliability issues)
|
|
183
|
+
- **Flexible Token Configuration**: Four methods to provide token - choose what works best for your setup
|
|
184
|
+
- **Clear Error Messages**: HTTP status codes (401, 403, 404, 422) with actionable suggestions
|
|
185
|
+
- **Setup Wizard**: `claude-hooks setup-github` validates token and guides configuration
|
|
186
|
+
- **Consistency**: All PRs follow same format with task-ids, descriptions, and appropriate reviewers
|
|
187
|
+
- **Interactive**: Preview and edit PR before creation, choose between Create/Edit/Cancel
|
|
188
|
+
- **Recovery Support**: Failed PRs save metadata to .claude/out/pr-metadata.json for manual retry
|
|
189
|
+
|
|
190
|
+
### 📚 Documentation
|
|
191
|
+
|
|
192
|
+
- **Help Text**: Added create-pr and setup-github commands to `claude-hooks help`
|
|
193
|
+
- **Token Configuration**: Clear explanation of 4-level token resolution priority
|
|
194
|
+
- **Use Cases**: Documented create-pr workflow with example output
|
|
195
|
+
- **Configuration Example**: Added `templates/config.github.example.json` with reviewer and label rules
|
|
196
|
+
- **Architecture Note**: Claude only for metadata generation (brain), Octokit for PR creation (deterministic actions)
|
|
197
|
+
- **Post-Install Message**: Added GitHub PR creation section with setup-github and create-pr examples
|
|
198
|
+
- **README Updates**:
|
|
199
|
+
- Quick Setup section for GitHub PR creation
|
|
200
|
+
- File structure updated with new GitHub modules
|
|
201
|
+
- Utility modules table includes github-api.js, task-id.js, interactive-ui.js
|
|
202
|
+
- Task-ID detection in commit messages documented
|
|
203
|
+
|
|
204
|
+
## [2.4.2] - 2025-11-24
|
|
205
|
+
|
|
206
|
+
### 🗑️ Removed
|
|
207
|
+
|
|
208
|
+
- **SKIP_ANALYSIS Feature** - Removed broken/experimental code exclusion feature
|
|
209
|
+
- **What was removed**: `// SKIP_ANALYSIS_LINE` and `// SKIP_ANALYSIS_BLOCK` comment markers
|
|
210
|
+
- **Why**: Feature never worked reliably - hooks analyze git diff instead of full files, so markers in previous commits weren't detected
|
|
211
|
+
- **Impact**: No user action needed - feature was marked EXPERIMENTAL/BROKEN and wasn't functional
|
|
212
|
+
- **Cleanup**: Removed all code, documentation, and references from README.md, CHANGELOG.md
|
|
213
|
+
|
|
8
214
|
## [2.4.1] - 2025-11-19
|
|
9
215
|
|
|
10
216
|
### 🐛 Fixed
|
|
11
217
|
|
|
12
218
|
- **Git Bash Windows Support** - Claude hooks now works correctly on Git Bash in Windows
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
219
|
+
- **What changed**:
|
|
220
|
+
- `--skip-auth` now skips both Claude CLI verification AND authentication (previously only auth)
|
|
221
|
+
- Windows detection now tries native Claude first, WSL as fallback
|
|
222
|
+
- `spawn()` now uses `shell: true` to resolve `.cmd`/`.bat` executables
|
|
223
|
+
- **Why**:
|
|
224
|
+
- Installation with `--skip-auth` was failing before copying `.md` files and presets
|
|
225
|
+
- Code assumed Claude must always run via WSL on Windows, ignoring native installations
|
|
226
|
+
- Git Bash runs Node.js natively on Windows, not in WSL
|
|
227
|
+
- `spawn()` without shell couldn't find Windows batch files
|
|
228
|
+
- **Files updated**:
|
|
229
|
+
- `bin/claude-hooks:512-518` - Skip auth now skips Claude CLI check
|
|
230
|
+
- `bin/claude-hooks:532-544` - Native Windows Claude detection
|
|
231
|
+
- `lib/utils/claude-client.js:75-115` - Smart platform detection with fallback
|
|
232
|
+
- `lib/utils/claude-client.js:145-148` - Added `shell: true` for Windows compatibility
|
|
233
|
+
- **Impact**: Git Bash users on Windows can now use native Claude (via npm/NVM) instead of requiring WSL
|
|
28
234
|
|
|
29
235
|
### 🎯 User Experience
|
|
30
236
|
|
|
@@ -37,111 +243,111 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
|
|
|
37
243
|
### ⚠️ BREAKING CHANGES
|
|
38
244
|
|
|
39
245
|
- **Debug Mode** - Environment variable `DEBUG` no longer supported
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
246
|
+
- **What changed**: Removed `DEBUG` environment variable support from `lib/utils/logger.js`
|
|
247
|
+
- **Why**: Aligns with project philosophy "no environment variables" and provides better user experience
|
|
248
|
+
- **Migration**: Use `claude-hooks --debug true` instead of `DEBUG=1 git commit`
|
|
249
|
+
- **Alternative**: Set `"system": { "debug": true }` in `.claude/config.json`
|
|
44
250
|
|
|
45
251
|
### 🔄 Changed
|
|
46
252
|
|
|
47
253
|
- **File Size Limit Increased** - Default `maxFileSize` increased from 100KB to 1MB
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
254
|
+
- **What changed**: `analysis.maxFileSize` now defaults to 1000000 (1MB) instead of 100000 (100KB)
|
|
255
|
+
- **Why**: Previous 100KB limit was too restrictive, rejected many legitimate source files
|
|
256
|
+
- **Files updated**:
|
|
257
|
+
- `lib/config.js:29` - Default configuration
|
|
258
|
+
- All preset configs in `templates/presets/*/config.json`
|
|
259
|
+
- `templates/config.example.json`
|
|
260
|
+
- **Impact**: More files will be analyzed without manual config adjustment
|
|
261
|
+
- **User action**: If you want stricter limits, set `"maxFileSize": 100000` in `.claude/config.json`
|
|
56
262
|
|
|
57
263
|
### ✨ Added
|
|
58
264
|
|
|
59
265
|
- **Debug CLI Command** - New `--debug` flag for managing debug mode
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
266
|
+
- **Usage**: `claude-hooks --debug <true|false|status>`
|
|
267
|
+
- **Purpose**: Enables detailed logging for troubleshooting
|
|
268
|
+
- **Implementation**: Generic `updateConfig()` function in `bin/claude-hooks:1262`
|
|
269
|
+
- **Benefits**: Consistent with `--set-preset` pattern, no need to remember env var syntax
|
|
64
270
|
|
|
65
271
|
- **Generic Config Updater** - Reusable `updateConfig()` function
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
272
|
+
- **Purpose**: Centralized config update logic for all CLI commands
|
|
273
|
+
- **Location**: `bin/claude-hooks:1262`
|
|
274
|
+
- **Features**: Dot notation path support, custom validators, custom success messages
|
|
275
|
+
- **Extensibility**: Easy to add new config commands (`--set-max-files`, `--set-timeout`, etc.)
|
|
70
276
|
|
|
71
277
|
### 🔄 Changed
|
|
72
278
|
|
|
73
279
|
- **setPreset() Refactored** - Now uses generic `updateConfig()` function
|
|
74
|
-
|
|
75
|
-
|
|
280
|
+
- **Effect**: Less code duplication, consistent error handling
|
|
281
|
+
- **Location**: `bin/claude-hooks:1349`
|
|
76
282
|
|
|
77
283
|
- **Debug Mode Activation** - Hooks now enable debug from config
|
|
78
|
-
|
|
79
|
-
|
|
284
|
+
- **Files**: `lib/hooks/pre-commit.js:185`, `lib/hooks/prepare-commit-msg.js:124`
|
|
285
|
+
- **Effect**: Debug logs appear when `config.system.debug` is true
|
|
80
286
|
|
|
81
287
|
### 📚 Documentation
|
|
82
288
|
|
|
83
289
|
- **Help Text Updated** - Added `--debug` command documentation
|
|
84
|
-
|
|
85
|
-
|
|
290
|
+
- **Location**: `bin/claude-hooks:1170`
|
|
291
|
+
- **Includes**: Command description, examples, debug mode section
|
|
86
292
|
|
|
87
293
|
- **README.md Updated** - Debug command documented in multiple sections
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
294
|
+
- **Cheatsheet**: Added debug commands to "Comandos Frecuentes" (line 52-56)
|
|
295
|
+
- **Tips**: Updated tip #4 with CLI command (line 269)
|
|
296
|
+
- **Features**: Updated debug mode description (line 492)
|
|
91
297
|
|
|
92
298
|
## [2.3.1] - 2025-11-13
|
|
93
299
|
|
|
94
300
|
### 🔄 Changed
|
|
95
301
|
|
|
96
302
|
- **Configuration Priority** - Updated merge order: `defaults < user config < preset config`
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
303
|
+
- **Rationale**: User sets general preferences in `.claude/config.json`, preset provides tech-stack-specific overrides (highest priority)
|
|
304
|
+
- **Effect**: Presets now correctly override user settings (e.g., preset's `model: sonnet` wins over user's `model: haiku`)
|
|
305
|
+
- **Files updated**: `lib/config.js:116` (merge logic), README.md:222 (documentation)
|
|
100
306
|
|
|
101
307
|
### ✨ Added
|
|
102
308
|
|
|
103
309
|
- **Installation Diagnostics Utility** - New `lib/utils/installation-diagnostics.js`
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
310
|
+
- **Purpose**: Reusable error diagnostics with actionable remediation steps
|
|
311
|
+
- **Exports**: `formatError()`, `getInstallationDiagnostics()`, `isInstallationHealthy()`
|
|
312
|
+
- **Use case**: Detects installation in wrong directory (common cause of "presets not found" errors)
|
|
313
|
+
- **Extensible**: Documented future enhancements (file permissions, Claude CLI check, etc.)
|
|
108
314
|
|
|
109
315
|
- **Enhanced Error Messages** - Better guidance when installation fails
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
316
|
+
- **Presets not found** (`lib/utils/preset-loader.js:194`): Shows current vs repo root directory
|
|
317
|
+
- **Hook scripts missing** (`templates/pre-commit:76`, `templates/prepare-commit-msg:76`): Early `.claude/` check with remediation steps
|
|
318
|
+
- **npm package issues**: Suggests verifying `npm list -g claude-git-hooks`
|
|
113
319
|
|
|
114
320
|
- **Bash Wrapper Early Validation** - Hooks now check `.claude/` exists before attempting execution
|
|
115
|
-
|
|
116
|
-
|
|
321
|
+
- **Why**: Fails fast with helpful message if installation incomplete or performed from wrong directory
|
|
322
|
+
- **Effect**: Users immediately know to `cd` to repo root and reinstall
|
|
117
323
|
|
|
118
324
|
- **Claude Error Diagnostics** - New `lib/utils/claude-diagnostics.js`
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
325
|
+
- **Purpose**: Detects and formats Claude CLI errors with actionable solutions
|
|
326
|
+
- **Error types**: Rate limit, authentication, network, invalid response, generic
|
|
327
|
+
- **Exports**: `detectClaudeError()`, `formatClaudeError()`, `ClaudeErrorType`, `isRecoverableError()`
|
|
328
|
+
- **Integration**: `lib/utils/claude-client.js:147` automatically detects and formats errors
|
|
329
|
+
- **Effect**: Users see clear guidance (e.g., "Rate limit resets in 2 hours, switch to haiku model")
|
|
124
330
|
|
|
125
331
|
### 📚 Documentation
|
|
126
332
|
|
|
127
333
|
- **CUSTOMIZATION_GUIDE.md** - Comprehensive preset creation guide in `/templates`
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
334
|
+
- Visual flowchart showing prompt assembly (8-step diagram)
|
|
335
|
+
- Step-by-step preset creation tutorial
|
|
336
|
+
- Placeholder system reference with examples
|
|
337
|
+
- Preset kickstart prompt for Claude-assisted generation
|
|
338
|
+
- **Burst limit warning**: Explains why git hooks hit rate limits when manual CLI doesn't
|
|
339
|
+
- Referenced in README.md:333 for discoverability
|
|
134
340
|
|
|
135
341
|
- **Utility Modules Reference** - New section in README.md:596
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
342
|
+
- Table of all `lib/utils/` modules with purpose and key exports
|
|
343
|
+
- Usage examples for other Claude instances
|
|
344
|
+
- Promotes code reuse across projects
|
|
139
345
|
|
|
140
346
|
- **README-NPM.md** - Complete rewrite for npm package page
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
347
|
+
- **Length**: 266 lines (up from 145 lines, but more focused)
|
|
348
|
+
- **Updated**: v2.3.0 presets, v2.2.0 config centralization, v2.0.0 cross-platform
|
|
349
|
+
- **Added**: Configuration priority explanation, troubleshooting, "What's New" section
|
|
350
|
+
- **Removed**: Outdated v1.x references, environment variable examples
|
|
145
351
|
|
|
146
352
|
### 🎯 User Experience
|
|
147
353
|
|
|
@@ -156,27 +362,27 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
|
|
|
156
362
|
### ✨ Added
|
|
157
363
|
|
|
158
364
|
- **Preset System (Phase 3)**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
365
|
+
- 🎯 6 built-in presets: `backend`, `frontend`, `fullstack`, `database`, `ai`, `default`
|
|
366
|
+
- 📦 Self-contained preset packages with custom prompts and configurations
|
|
367
|
+
- 🔍 Smart file filtering per preset (`.java` for backend, `.tsx` for frontend, etc.)
|
|
368
|
+
- 🎨 Rich metadata: tech stack, focus areas, file extensions, display names
|
|
369
|
+
- 🔌 Template inheritance with placeholder replacement ({{TECH_STACK}}, {{FOCUS_AREAS}})
|
|
370
|
+
- 🛠️ Manual preset selection via CLI: `claude-hooks --set-preset <name>`
|
|
371
|
+
- 📋 Preset management commands: `presets`, `preset current`, `--set-preset`
|
|
372
|
+
- 📖 See `next-steps/V2.3.0_PHASE3_PRESETS_FINAL.md` for full specification
|
|
167
373
|
|
|
168
374
|
- **CLI Enhancements**
|
|
169
|
-
|
|
170
|
-
|
|
375
|
+
- 🏷️ Added `--version`, `-v`, and `version` commands to display current version
|
|
376
|
+
- 📊 Version check on install with interactive update prompt (skippable with `--skip-auth` or `--force`)
|
|
171
377
|
|
|
172
378
|
### 🐛 Fixed
|
|
173
379
|
|
|
174
380
|
- **Critical Bug**: `prepare-commit-msg` now properly loads merged config (preset + user overrides)
|
|
175
|
-
|
|
176
|
-
|
|
381
|
+
- Was using sync default import instead of async `getConfig()`
|
|
382
|
+
- Preset settings were being ignored in commit message generation
|
|
177
383
|
- **Template Name Mismatch**: Fixed config.js template paths
|
|
178
|
-
|
|
179
|
-
|
|
384
|
+
- `COMMIT_MESSAGE.md` (was `CLAUDE_COMMIT_MESSAGE.md`)
|
|
385
|
+
- `ANALYZE_DIFF.md` (was `CLAUDE_ANALYZE_DIFF.md`)
|
|
180
386
|
- **Missing Auto-Update**: `checkVersionAndPromptUpdate()` now called during install
|
|
181
387
|
|
|
182
388
|
### 🗑️ Removed
|
|
@@ -239,45 +445,45 @@ git commit -m "message" # Now filters to .java, .xml, .yml only
|
|
|
239
445
|
### ✨ Added
|
|
240
446
|
|
|
241
447
|
- **Configuration Centralization (Phase 1)**
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
448
|
+
- 📁 Created `lib/config.js` - single source of truth for all configurable values
|
|
449
|
+
- 🔧 User override support via `.claude/config.json` with deep merge
|
|
450
|
+
- 📊 Structured config: analysis, commitMessage, subagents, templates, output, system, git
|
|
451
|
+
- 🚫 Eliminated environment variables (except OS for platform detection)
|
|
452
|
+
- 📖 See `next-steps/V2.2.0_CONFIG_CENTRALIZATION.md` for details
|
|
247
453
|
|
|
248
454
|
- **Prompt Externalization (Phase 2)**
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
455
|
+
- 📝 Extracted ALL embedded prompts to external .md template files
|
|
456
|
+
- 🔌 Created `loadPrompt()` utility - combines load + variable replacement
|
|
457
|
+
- 📄 New templates: `COMMIT_MESSAGE.md`, `ANALYZE_DIFF.md`
|
|
458
|
+
- 🎯 JavaScript is now completely "prompt-agnostic"
|
|
459
|
+
- 📖 See `next-steps/V2.2.0_PHASE2_PROMPTS.md` for details
|
|
254
460
|
|
|
255
461
|
- **Parallel Analysis**
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
462
|
+
- 🚀 True OS-level parallel execution using multiple Claude CLI processes simultaneously
|
|
463
|
+
- ⚡ `analyzeCodeParallel()` function runs batches via Node.js `Promise.all()`
|
|
464
|
+
- 📊 Configurable `batchSize` for optimal speed/cost balance (default: 2)
|
|
465
|
+
- 🔀 Automatic result consolidation with worst-case quality gate logic
|
|
466
|
+
- 📈 Real-time console output showing parallel batch launches and completion
|
|
467
|
+
- 🎯 Enabled by default for commits with 3+ files
|
|
468
|
+
- ⏱️ Speed improvement: up to 4x faster with `batchSize: 1`
|
|
263
469
|
|
|
264
470
|
### 🔄 Changed
|
|
265
471
|
|
|
266
472
|
- **Configuration Migration**
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
473
|
+
- ♻️ Migrated `lib/hooks/pre-commit.js` to use centralized config
|
|
474
|
+
- ♻️ Migrated `lib/hooks/prepare-commit-msg.js` to use centralized config
|
|
475
|
+
- ♻️ Migrated `lib/utils/claude-client.js` to use centralized config
|
|
476
|
+
- 🔧 `process.env.DEBUG` → `config.system.debug`
|
|
477
|
+
- 🔧 All hardcoded timeouts now configurable
|
|
272
478
|
|
|
273
479
|
- **Prompt Migration**
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
480
|
+
- ♻️ `prepare-commit-msg.js`: 40 lines → 15 lines (62% reduction)
|
|
481
|
+
- ♻️ `bin/claude-hooks`: 30 lines → 10 lines (67% reduction)
|
|
482
|
+
- 🎨 Prompts now editable without touching JavaScript code
|
|
277
483
|
|
|
278
484
|
- **Template Loading**
|
|
279
|
-
|
|
280
|
-
|
|
485
|
+
- 📂 Enhanced `loadTemplate()` with fallback: `.claude/` → `templates/`
|
|
486
|
+
- 🔀 Enables per-project customization of prompts
|
|
281
487
|
|
|
282
488
|
### 🗑️ Removed
|
|
283
489
|
|
|
@@ -302,6 +508,7 @@ git commit -m "message" # Now filters to .java, .xml, .yml only
|
|
|
302
508
|
No breaking changes. All defaults match previous behavior.
|
|
303
509
|
|
|
304
510
|
**Optional: Customize configuration**
|
|
511
|
+
|
|
305
512
|
```bash
|
|
306
513
|
# Create project config
|
|
307
514
|
mkdir -p .claude
|
|
@@ -323,6 +530,7 @@ EOF
|
|
|
323
530
|
```
|
|
324
531
|
|
|
325
532
|
**Optional: Customize prompts**
|
|
533
|
+
|
|
326
534
|
```bash
|
|
327
535
|
# Override commit message prompt
|
|
328
536
|
cp templates/COMMIT_MESSAGE.md .claude/
|
|
@@ -369,6 +577,7 @@ El marcador de bloque `// SKIP_ANALYSIS_BLOCK` permanece sin cambios.
|
|
|
369
577
|
|
|
370
578
|
**Why this change?**
|
|
371
579
|
The bash-based hooks created fundamental incompatibilities with Windows Git and IDE workflows (VSCode, IntelliJ), causing:
|
|
580
|
+
|
|
372
581
|
- Git worktree path conflicts (Windows paths incompatible with WSL)
|
|
373
582
|
- IDE commit failures when using Windows Git
|
|
374
583
|
- Developers forced to use WSL terminal exclusively, abandoning IDE Git features
|
|
@@ -376,16 +585,19 @@ The bash-based hooks created fundamental incompatibilities with Windows Git and
|
|
|
376
585
|
### ✅ Advantages
|
|
377
586
|
|
|
378
587
|
**Cross-Platform Native Support**
|
|
588
|
+
|
|
379
589
|
- ✅ Works with Windows Git, WSL, and Bash
|
|
380
590
|
- ✅ No more worktree path issues
|
|
381
591
|
- ✅ Single codebase for all platforms
|
|
382
592
|
|
|
383
593
|
**Dramatically Improved Maintainability**
|
|
594
|
+
|
|
384
595
|
- ✅ JavaScript/Node.js: ~60-70% of developers proficient vs ~1-2% with bash/jq/sed/awk
|
|
385
596
|
- ✅ Modern tooling: ESLint, Prettier, Jest testing framework
|
|
386
597
|
- ✅ VS Code debugging support vs echo statements
|
|
387
598
|
|
|
388
599
|
**Professional Development Practices**
|
|
600
|
+
|
|
389
601
|
- ✅ Unit and integration testing with Jest
|
|
390
602
|
- ✅ Type safety optional (TypeScript)
|
|
391
603
|
- ✅ Consistent error handling patterns
|
|
@@ -398,6 +610,7 @@ The bash-based hooks created fundamental incompatibilities with Windows Git and
|
|
|
398
610
|
### 🏆 Industry Success Cases
|
|
399
611
|
|
|
400
612
|
**Node.js Git Hooks - Proven Track Record:**
|
|
613
|
+
|
|
401
614
|
- **Husky**: 43k GitHub stars, 500+ contributors, 7M+ weekly npm downloads
|
|
402
615
|
- **lint-staged**: 12k stars, 200+ contributors
|
|
403
616
|
- **Commitizen**: 16k stars, industry standard
|
|
@@ -412,6 +625,7 @@ The bash-based hooks created fundamental incompatibilities with Windows Git and
|
|
|
412
625
|
### Migration Guide
|
|
413
626
|
|
|
414
627
|
Existing installations will continue working. To upgrade:
|
|
628
|
+
|
|
415
629
|
1. Run `claude-hooks update` to get v2.0.0
|
|
416
630
|
2. Run `claude-hooks install --force` to reinstall with Node.js hooks
|
|
417
631
|
3. No configuration changes needed - works transparently
|
|
@@ -421,27 +635,27 @@ Existing installations will continue working. To upgrade:
|
|
|
421
635
|
### Added
|
|
422
636
|
|
|
423
637
|
- 🚀 **Parallel Analysis with Subagents**
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
638
|
+
- New `CLAUDE_USE_SUBAGENTS` environment variable to enable parallel file analysis
|
|
639
|
+
- Each file analyzed by dedicated Claude subagent for faster processing
|
|
640
|
+
- Works across all analysis functions: pre-commit, message generation, and analyze-diff
|
|
641
|
+
- Significantly faster for commits with 3+ files
|
|
428
642
|
|
|
429
643
|
- ⚙️ **Subagent Configuration Options**
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
644
|
+
- `CLAUDE_SUBAGENT_MODEL` - Choose model: haiku (fast), sonnet (balanced), opus (thorough)
|
|
645
|
+
- `CLAUDE_SUBAGENT_BATCH_SIZE` - Control parallel processing (default: 3 files at once)
|
|
646
|
+
- Automatic result consolidation across all subagents
|
|
433
647
|
|
|
434
648
|
- ⏱️ **Execution Time Measurement**
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
649
|
+
- All operations now display execution time in seconds and milliseconds
|
|
650
|
+
- Pre-commit analysis: Shows time on success and failure
|
|
651
|
+
- Message generation: Shows generation time
|
|
652
|
+
- Analyze-diff: Shows analysis time
|
|
653
|
+
- Helps identify performance improvements and bottlenecks
|
|
440
654
|
|
|
441
655
|
- 🔧 **Git Worktree Support**
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
656
|
+
- `claude-hooks` now recognizes worktrees created in PowerShell from WSL
|
|
657
|
+
- Automatically converts Windows paths (C:\) to WSL paths (/mnt/c/)
|
|
658
|
+
- No more "not a git repository" errors when working in cross-platform worktrees
|
|
445
659
|
|
|
446
660
|
### Changed
|
|
447
661
|
|
|
@@ -456,14 +670,14 @@ Existing installations will continue working. To upgrade:
|
|
|
456
670
|
### Fixed
|
|
457
671
|
|
|
458
672
|
- 🔧 **Generación de prompt de resolución en modo SonarQube**
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
673
|
+
- Ahora se genera correctamente `claude_resolution_prompt.md` cuando el Quality Gate falla
|
|
674
|
+
- El archivo se genera cuando hay `blockingIssues`, independiente del tipo de fallo
|
|
675
|
+
- Corregido el flujo para que siempre muestre los issues críticos antes de generar el prompt
|
|
462
676
|
|
|
463
677
|
- 🎯 **Unificación de lógica de análisis**
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
678
|
+
- Eliminada lógica duplicada entre modo "clásico" y SonarQube
|
|
679
|
+
- Ahora siempre se usa modo SonarQube (como se especificó en v1.4.1)
|
|
680
|
+
- Simplificación del flujo de decisión en el pre-commit hook
|
|
467
681
|
|
|
468
682
|
### Changed
|
|
469
683
|
|
|
@@ -475,9 +689,9 @@ Existing installations will continue working. To upgrade:
|
|
|
475
689
|
### Fixed
|
|
476
690
|
|
|
477
691
|
- 🔧 Comando `analyze-diff` ahora siempre compara con ramas origin
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
692
|
+
- Si se especifica rama: compara con `origin/rama-especificada`
|
|
693
|
+
- Si no se especifica: compara con `origin/rama-actual`
|
|
694
|
+
- Fallback automático a `origin/develop` y luego `origin/main` si no existe la rama origin
|
|
481
695
|
|
|
482
696
|
### Changed
|
|
483
697
|
|
|
@@ -508,13 +722,13 @@ Existing installations will continue working. To upgrade:
|
|
|
508
722
|
### Added
|
|
509
723
|
|
|
510
724
|
- 🔍 Nuevo comando `claude-hooks analyze-diff [base]` para análisis de diferencias entre ramas
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
725
|
+
- Genera título de PR conciso (máx. 72 caracteres)
|
|
726
|
+
- Crea descripción detallada del PR con markdown
|
|
727
|
+
- Sugiere nombre de rama siguiendo formato tipo/descripcion
|
|
728
|
+
- Identifica tipo de cambio (feature/fix/refactor/docs/test/chore)
|
|
729
|
+
- Detecta breaking changes
|
|
730
|
+
- Proporciona notas de testing recomendado
|
|
731
|
+
- Guarda resultados en `.claude-pr-analysis.json`
|
|
518
732
|
|
|
519
733
|
### Changed
|
|
520
734
|
|
|
@@ -538,11 +752,11 @@ Existing installations will continue working. To upgrade:
|
|
|
538
752
|
### Added
|
|
539
753
|
|
|
540
754
|
- 🚫 Comentario `// SKIP-ANALYSIS` para excluir código del análisis
|
|
541
|
-
|
|
542
|
-
|
|
755
|
+
- Una línea: excluye la siguiente línea
|
|
756
|
+
- Bloque: código entre dos comentarios `// SKIP_ANALYSIS_BLOCK` es excluido
|
|
543
757
|
- 📝 Excepciones para Spring Framework en criterios de evaluación
|
|
544
|
-
|
|
545
|
-
|
|
758
|
+
- `@Autowired` no es considerado issue bloqueante (máximo severidad MAJOR)
|
|
759
|
+
- Inyección de dependencias con field injection es aceptable
|
|
546
760
|
|
|
547
761
|
### Changed
|
|
548
762
|
|