claude-git-hooks 2.51.2 → 2.66.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.
package/CHANGELOG.md CHANGED
@@ -5,31 +5,475 @@ 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.66.1] - 2026-06-10
9
+
10
+ ### 🐛 Fixed
11
+ - Normalized path separators to forward slashes in staleness checker for cross-platform compatibility
12
+
13
+
14
+ ## [2.66.0] - 2026-06-10
15
+
16
+ ### ✨ Added
17
+ - Multi-language extractor registry with pluggable per-language architecture [AUT-3742]
18
+ - End-to-end SDLC stability check test suite
19
+ - Version alignment validation now scoped to base branch tags (#185)
20
+ - Extractor notes template for documenting per-language extractors
21
+
22
+ ### 🔧 Changed
23
+ - Moved arrow-function extraction from monolithic extractor to pluggable extractor module [AUT-3742]
24
+ - Decoupled `lib/` from `.library/` static imports with ESLint enforcement rule [AUT-3742]
25
+ - Library maintenance pipeline now runs before tag push in `create-pr`, ensuring library books are included in tagged commits
26
+ - Simplified `bump-version` interactive file selection to direct toggle list, removing multi-choice menu
27
+ - Tags are force-repointed to HEAD after library commit so tagged version includes regenerated books
28
+
29
+ ### 🐛 Fixed
30
+ - Fixed `create-pr` gotcha solicitation receiving empty file paths instead of actual book content (#190)
31
+ - Fixed `create-pr` tag comparison using global tag list instead of base branch scope
32
+ - Fixed `create-pr` library pipeline leaking host-repo paths into foreign repositories (#186)
33
+ - Fixed `bump-version` crashing on non-semver version files such as Maven `${revision}` placeholders (#187)
34
+ - Fixed version tag lookup scanning all branches instead of only the HEAD branch (#185)
35
+ - Fixed stale git worktree leftovers causing integration test failures
36
+
37
+ ### 🗑️ Removed
38
+ - Removed per-file custom version entry option (`promptEditField`) from `bump-version` interactive selection
39
+
40
+
41
+ ## [2.65.0] - 2026-06-08
42
+
43
+ ### ✨ Added
44
+ - Multi-language extractor registry with pluggable per-language extractors (AUT-3742)
45
+ - Extractor interface contract and runtime validator for language extractor plugins (AUT-3742)
46
+ - JS extractor notes template for documenting new extractors (AUT-3742)
47
+ - Test harness with JS fixtures for extractor validation (AUT-3742)
48
+ - Version alignment now scoped to base branch tags instead of global tag lookup
49
+
50
+ ### 🔧 Changed
51
+ - Arrow-function extraction moved from monolithic extract.js to pluggable JS extractor module (AUT-3742)
52
+ - Decoupled lib/ from .library/ static imports with ESLint enforcement — lib/ must use dynamic import() for Library integration (AUT-3742)
53
+ - Library maintenance pipeline in create-pr now runs before tag push so tags include regenerated books
54
+ - Unpushed tags are force-repointed to HEAD after library commit to include book changes
55
+ - Gotcha solicitation now receives full book content instead of just file paths
56
+ - bump-version interactive file selection simplified — goes directly to toggle list, non-semver files pre-deselected
57
+
58
+ ### 🐛 Fixed
59
+ - Fixed create-pr library pipeline running incorrectly in foreign repos by deriving paths from resolver config (#186)
60
+ - Fixed bump-version crash when non-semver files (e.g., Maven `${revision}`) reached version parser (#187)
61
+ - Fixed create-pr comparing tags against global scope instead of base branch (#185, #189)
62
+ - Fixed create-pr using stale tag reference after library pipeline commit
63
+ - Fixed local tag lookup not scoped to HEAD branch, causing cross-branch version mismatches
64
+
65
+ ### 🗑️ Removed
66
+ - Removed per-file custom version editing (option `e`) from bump-version interactive selection
67
+ - Removed `promptMenu` and `promptEditField` usage from bump-version flow
68
+
69
+
70
+ ## [2.64.4] - 2026-06-08
71
+
72
+ ### ✨ Added
73
+ - Added multi-language extractor registry with pluggable architecture and runtime interface validation (AUT-3742, #184)
74
+ - Added JS extractor as first pluggable extractor with dedicated test harness and fixtures (AUT-3742)
75
+ - Added extractor notes template for documenting per-language extractors (AUT-3742)
76
+ - Added branch-scoped tag lookup functions `getLatestLocalTagOnBranch()` and `getLatestRemoteTagOnBranch()` to git-tag-manager (#185)
77
+ - Added branch-scoped version alignment validation in `create-pr` (#185)
78
+
79
+ ### 🔧 Changed
80
+ - Decoupled `lib/` from `.library/` static imports with ESLint restricted-imports guard (AUT-3742)
81
+ - Moved arrow-function extraction from monolithic extractor into pluggable JS extractor module (AUT-3742)
82
+ - Simplified `bump-version` interactive file selection — removed menu, goes directly to toggle list with non-semver files pre-deselected (#187)
83
+ - Library pipeline in `create-pr` now derives paths from resolver config, preventing git-hooks paths from leaking into foreign repos (#186)
84
+ - Reordered `create-pr` steps so library pipeline runs before tag push, then re-points unpushed tags to HEAD to include library commits
85
+
86
+ ### 🐛 Fixed
87
+ - Fixed `bump-version` crash when non-semver files (e.g., Maven `${revision}`) were included in version resolution (#187)
88
+ - Fixed `create-pr` library pipeline using hardcoded paths that broke in foreign repositories (#186)
89
+ - Fixed version alignment and tag lookup returning results from unrelated branches instead of scoping to base branch (#185)
90
+ - Fixed `create-pr` tag becoming stale after library book regeneration by running the pipeline before tag push and re-pointing tags
91
+
92
+ ### 🗑️ Removed
93
+ - Removed `promptMenu` and `promptEditField` options from `bump-version` interactive file selection (#187)
94
+
95
+
96
+ ## [2.64.3] - 2026-06-08
97
+
98
+ ### ✨ Added
99
+ - Added multi-language extractor registry with pluggable interface, including JS extractor and notes template (AUT-3742)
100
+ - Added library maintenance pipeline step in create-pr that regenerates books before tag push
101
+ - Added branch-scoped tag lookup functions (`getLatestLocalTagOnBranch`, `getLatestRemoteTagOnBranch`) to git-tag-manager
102
+ - Added ESLint rule preventing `lib/` from statically importing `.library/` modules (AUT-3742)
103
+ - Added extractor test harness with JS fixtures (AUT-3742)
104
+
105
+ ### 🔧 Changed
106
+ - Moved arrow-function extraction from monolithic `extract.js` into pluggable extractor under `librarian/extractors/registered/js/` (AUT-3742)
107
+ - Scoped version alignment validation to base branch tags instead of global tag lookup
108
+ - Simplified bump-version interactive file selection — goes directly to toggle list, non-semver files pre-deselected
109
+ - Library pipeline now derives booksDir/sourceDir from resolver config when repoRoot is overridden, preventing path leakage into foreign repos
110
+ - Unpushed tags are force-repointed to HEAD after library commit so tags include regenerated books
111
+
112
+ ### 🐛 Fixed
113
+ - Fixed create-pr using stale tag for comparison after library regeneration created a new commit
114
+ - Fixed create-pr running library pipeline in foreign repos where `.library/` paths were invalid (#186)
115
+ - Fixed bump-version crashing on non-semver version files (e.g., Maven `${revision}`) by excluding them from version resolution (#187)
116
+ - Fixed local tag lookup scanning tags from all branches instead of only the current HEAD branch (#185)
117
+
118
+ ### 🗑️ Removed
119
+ - Removed per-file custom version editing (`promptEditField` option) from bump-version interactive selection
120
+ - Removed `promptMenu` four-option flow from bump-version in favor of direct toggle list
121
+
122
+
123
+ ## [2.64.2] - 2026-06-08
124
+
125
+ ### ✨ Added
126
+ - Multi-language extractor registry with pluggable extractor interface and JS extractor (AUT-3742, #184)
127
+ - Extractor notes template and per-extractor documentation standard (AUT-3742)
128
+ - Test harness for extractors with JS fixtures (AUT-3742)
129
+ - ESLint rule preventing lib/ from statically importing .library/ modules (AUT-3742)
130
+ - Version alignment now scoped to base branch tags for accurate cross-branch comparisons (#185)
131
+ - Library maintenance pipeline step in create-pr to regenerate books before tagging (#187)
132
+
133
+ ### 🔧 Changed
134
+ - Moved arrow-function extraction from monolithic extractor to pluggable JS extractor module (AUT-3742)
135
+ - Decoupled lib/ from .library/ imports — library integration now uses dynamic import with graceful degradation (AUT-3742)
136
+ - Library pipeline in create-pr derives paths from resolver.yaml config instead of hardcoded values (#186)
137
+ - Simplified bump-version interactive file selection to use toggle list directly, removing menu options (a/s/e/c) (#187)
138
+ - Tags are re-pointed to HEAD after library commit so tagged releases include regenerated books (#187)
139
+
140
+ ### 🐛 Fixed
141
+ - Fixed bump-version crashing on non-semver version files (e.g., Maven `${revision}`) by excluding them from version resolution (#187)
142
+ - Fixed create-pr library pipeline leaking git-hooks paths into foreign repos (#186)
143
+ - Fixed local tag lookup scanning all branches instead of scoping to HEAD branch (#185)
144
+ - Fixed stale tags in create-pr when library pipeline generates a new commit after tag creation (#187)
145
+
146
+ ### 🗑️ Removed
147
+ - Removed per-file custom version editing (option `e`) from bump-version interactive selection (#187)
148
+
149
+
150
+ ## [2.64.1] - 2026-06-08
151
+
152
+ ### ✨ Added
153
+ - Multi-language extractor registry with pluggable architecture for Library book generation [AUT-3742] (#184)
154
+ - JS extractor as first pluggable extractor with Tree-sitter parsing, extractor notes template, and test harness [AUT-3742] (#184)
155
+ - ESLint rule preventing `lib/` from statically importing `.library/` modules [AUT-3742] (#184)
156
+ - Branch-scoped tag lookup functions `getLatestLocalTagOnBranch()` and `getLatestRemoteTagOnBranch()` in git-tag-manager (#185)
157
+
158
+ ### 🔧 Changed
159
+ - Library pipeline (`createPrPipeline`) now derives `booksDir`/`sourceDir` from overridden `repoRoot`, preventing git-hooks paths from leaking into foreign repos (#186)
160
+ - Version alignment scoped to base branch tags instead of global tag list (#185)
161
+ - Bump-version interactive file selection simplified to direct toggle list with non-semver files pre-deselected
162
+ - Moved arrow-function extraction from monolithic `extract.js` to pluggable extractor module [AUT-3742]
163
+
164
+ ### 🐛 Fixed
165
+ - Excluded non-semver files (e.g., Maven `${revision}`) from version resolution in bump-version command, preventing `parseVersion()` failures
166
+ - Fixed library pipeline using hardcoded git-hooks paths when running in foreign repos (#186)
167
+ - Scoped local tag lookup to HEAD branch to avoid cross-branch version pollution (#185)
168
+
169
+ ### 🗑️ Removed
170
+ - Removed menu-based file selection (all/select/edit/cancel) from bump-version in favor of direct toggle list
171
+ - Removed per-file custom version entry (`targetVersion`) from interactive file selection
172
+
173
+
174
+ ## [2.64.0] - 2026-06-08
175
+
176
+ ### ✨ Added
177
+ - Multi-language extractor registry with pluggable interface and JS extractor (AUT-3742)
178
+ - Extractor notes template for documenting per-language extractors (AUT-3742)
179
+ - Test harness with JS fixtures for extractor validation (AUT-3742)
180
+ - Branch-scoped tag lookup methods `getLatestLocalTagOnBranch()` and `getLatestRemoteTagOnBranch()` in git-tag-manager
181
+ - ESLint `no-restricted-imports` rule preventing `lib/` from statically importing `.library/` modules (AUT-3742)
182
+
183
+ ### 🔧 Changed
184
+ - Moved arrow-function extraction from monolithic `extract.js` to pluggable extractor module under `librarian/extractors/registered/js/` (AUT-3742)
185
+ - `validateVersionAlignment()` now accepts a `baseBranch` parameter, scoping version checks to the relevant branch tags instead of all tags
186
+ - Library pipeline (`createPrPipeline`) now derives `booksDir`/`sourceDir` from resolver config when `repoRoot` is overridden, preventing path leakage into foreign repos
187
+
188
+ ### 🐛 Fixed
189
+ - Fixed local tag lookup returning tags from unrelated branches instead of scoping to HEAD branch
190
+ - Fixed library pipeline leaking git-hooks internal paths into foreign repos during PR creation (#185)
191
+
192
+
193
+ ## [2.63.1] - 2026-06-03
194
+
195
+ ### ✨ Added
196
+
197
+ - Multi-language extractor registry with pluggable interface and runtime validation (AUT-3742, #184)
198
+ - JS extractor as first pluggable extractor with full EXTRACTOR_NOTES documentation (AUT-3742)
199
+ - Extractor notes template for documenting new language extractors (AUT-3742)
200
+ - Test harness with JS fixtures for extractor validation (AUT-3742)
201
+ - Version alignment scoped to base branch tags for accurate cross-branch versioning
202
+
203
+ ### 🔧 Changed
204
+
205
+ - Decoupled lib/ from .library/ imports with ESLint no-restricted-imports rule to enforce package boundary (AUT-3742)
206
+ - Refactored arrow-function extraction from monolithic extract.js into pluggable JS extractor module (AUT-3742)
207
+
208
+ ### 🐛 Fixed
209
+
210
+ - Scoped local tag lookup to HEAD branch to prevent cross-branch version conflicts
211
+
212
+ ## [2.63.0] - 2026-06-03
213
+
214
+ ### ✨ Added
215
+
216
+ - Added multi-language extractor registry with convention-driven loader, priority-based lookup, and warn-and-skip error handling (AUT-3742)
217
+ - Added Extractor interface definition with JSDoc types and runtime validator for pluggable per-language extractors (AUT-3742)
218
+ - Added JS/ESM pluggable extractor conforming to the new Extractor interface (AUT-3742)
219
+ - Added extractor notes template and canonical JS extractor documentation covering supported constructs, known limitations, and test fixtures (AUT-3742)
220
+ - Added ESLint `no-restricted-imports` rule preventing `lib/` from statically importing `.library/` modules (AUT-3742)
221
+ - Added extractor test harness with JS fixtures for eight construct categories (AUT-3742)
222
+
223
+ ### 🔧 Changed
224
+
225
+ - Refactored arrow-function extraction from monolithic `extract.js` into standalone pluggable extractor module under `librarian/extractors/registered/js/` (AUT-3742)
226
+ - Decoupled `lib/` source code from `.library/` imports — runtime integration now requires dynamic `import()` with graceful degradation (AUT-3742)
227
+
228
+ ## [2.62.0] - 2026-06-02
229
+
230
+ ### ✨ Added
231
+
232
+ - Added structure detector pipeline for Library bootstrap — 3-stage detection (filesystem scan → Haiku inference → interactive console) that generates `.library/structure.yaml` config (AUT-3741)
233
+ - Added deterministic filesystem scanner with configurable depth/child limits, BOM file detection, and language-by-layer counting (AUT-3741)
234
+ - Added Haiku-based structure inference with exponential-backoff retry, scanner-detected language reconciliation, and graceful degradation to stub config on API failure (AUT-3741)
235
+ - Added interactive 3-option console flow (Accept / Reject / Retry) with re-run safety supporting Keep / Overwrite / Merge of existing configs (AUT-3741)
236
+ - Added structure detector documentation to Library README including sequence diagram, consumer contract, config format, and worked example (AUT-3741)
237
+
238
+ ### 🐛 Fixed
239
+
240
+ - Fixed tag staleness during Library regeneration (#179)
241
+
242
+ ## [2.61.2] - 2026-06-01
243
+
244
+ ### 🐛 Fixed
245
+
246
+ - Fixed incorrect import path for gotcha solicitation in PR pipeline
247
+
248
+ ## [2.61.1] - 2026-06-01
249
+
250
+ ### ✨ Added
251
+
252
+ - Auto-regeneration of stale Library books during `create-release` — stale books are now regenerated before the release is tagged, keeping the tag accurate (#178, AUT-3738)
253
+
254
+ ### 🔧 Changed
255
+
256
+ - Staleness warning templates are now context-aware: `CONSOLE_WARNING_TEMPLATE` and `PR_BODY_SECTION_TEMPLATE` accept an `autoRegen` option to tailor messaging per consumer (`will-run` for create-release, `deferred` for bump-version, `completed`/`failed` in PR body)
257
+ - PR body staleness section now reflects the actual auto-regeneration outcome instead of always listing remediation scripts
258
+ - Console staleness warning in `bump-version` now tells the user that Library will be auto-regenerated when they run `create-pr`
259
+
260
+ ### 🗑️ Removed
261
+
262
+ - Removed static recommended-scripts list from console staleness warnings (replaced by context-aware auto-regeneration messages)
263
+
264
+ ## [2.61.0] - 2026-06-01
265
+
266
+ ### ✨ Added
267
+
268
+ - Added canonical staleness-warning templates (`CONSOLE_WARNING_TEMPLATE`, `PR_BODY_SECTION_TEMPLATE`, `PR_TAG_VALUE`) for consistent Library staleness messaging across all consumer commands (AUT-3738)
269
+ - Added non-blocking Library staleness verification gate to the `create-release` workflow — warns operators when Library books are out of date without blocking the release (AUT-3738)
270
+ - Added automatic release PR creation step in `create-release` with idempotency check, staleness section in PR body wrapped in marker comments, and `library-stale` label when applicable (AUT-3738)
271
+ - Added `LIBRARY_VERIFY_SKIPPED_WARNING_RELEASE` constant for release-specific Library verification skip messaging (AUT-3738)
272
+
273
+ ### 🔧 Changed
274
+
275
+ - Refactored `bump-version` Library warning to use the canonical `CONSOLE_WARNING_TEMPLATE` instead of inline formatting (AUT-3738)
276
+ - Changed `create-release` Library staleness gate from blocking (exit on stale) to non-blocking (warn and continue), using the librarian `verify()` API instead of raw staleness tools (AUT-3738)
277
+ - Refactored `library-warnings.js` to re-export canonical wording from the librarian messages module instead of defining constants inline (AUT-3738)
278
+ - Updated Library books for `create-release`, `bump-version`, and `library-warnings` to reflect new dependencies and exports (AUT-3738)
279
+
280
+ ### 🗑️ Removed
281
+
282
+ - Removed blocking Library staleness check from `create-release` that imported `.library/tools/staleness.js` directly and aborted on drift (AUT-3738)
283
+ - Removed `LIBRARY_STALE_WARNING` constant from `library-warnings.js`, replaced by canonical `CONSOLE_WARNING_TEMPLATE` (AUT-3738)
284
+
285
+ ## [2.61.0] - 2026-05-29
286
+
287
+ ### ✨ Added
288
+
289
+ - Added gotcha solicitation orchestrator for the Library system, enabling interactive developer prompts to capture known gotchas per book during the create-pr pipeline (AUT-3735)
290
+ - Added end-to-end cross-cutting tests for the gotcha solicitation flow covering manual-additions preservation and API-down graceful degradation (AUT-3735)
291
+ - Added Library verification gate for the bump-version workflow with warning constants in `library-warnings.js` (#176, AUT-3737)
292
+
293
+ ### 🔧 Changed
294
+
295
+ - Updated bump-version book to reference the new `library-warnings.js` dependency (AUT-3737)
296
+
297
+ ## [2.60.0] - 2026-06-01
298
+
299
+ ### ✨ Added
300
+
301
+ - Added canonical staleness-warning templates (`CONSOLE_WARNING_TEMPLATE`, `PR_BODY_SECTION_TEMPLATE`, `PR_TAG_VALUE`) for consistent Library staleness messaging across all consumer commands (AUT-3738)
302
+ - Added non-blocking Library staleness verification gate to the `create-release` workflow — warns operators when Library books are out of date without blocking the release (AUT-3738)
303
+ - Added staleness section to release PR body when Library is stale, wrapped in marker comments for downstream tooling (AUT-3738)
304
+
305
+ ### 🔧 Changed
306
+
307
+ - Refactored `bump-version` Library warning to use the canonical `CONSOLE_WARNING_TEMPLATE` instead of inline formatting (AUT-3738)
308
+ - Updated Library books for `create-release`, `bump-version`, and `library-warnings` to reflect new dependencies and exports (AUT-3738)
309
+
310
+ ### 🗑️ Removed
311
+
312
+ - Removed gotcha solicitation orchestrator (`gotcha-solicitation.js`) from the Library system (AUT-3738)
313
+
314
+ ## [2.59.0] - 2026-05-29
315
+
316
+ ### ✨ Added
317
+
318
+ - Library verification gate in `bump-version` command — warns about stale or missing Library books before proceeding with version bump (AUT-3737)
319
+ - Read-only `verify()` staleness check to librarian module with never-throws guarantee (AUT-3737)
320
+ - Warning wording constants for Library verification gates in `lib/messages/library-warnings.js` (AUT-3737)
321
+ - `updatePullRequestBody()` method to GitHub API utility (#175)
322
+
323
+ ### 🔧 Changed
324
+
325
+ - Back-merge co-change pipeline "skipped" message now uses `logger.warning` instead of raw stderr write (#175)
326
+ - Library books synced for back-merge and github-api modules (#175)
327
+
328
+ ## [2.58.0] - 2026-05-29
329
+
330
+ ### ✨ Added
331
+
332
+ - Integrated co-change correlation pipeline into back-merge workflow — runs 6-step detection, mode resolution, sidecar write, injection, and report generation after merge commit (AUT-3777)
333
+ - Added `updatePullRequestBody()` to GitHub API module for updating PR body content
334
+ - Auto-attach co-change analysis report to back-merge PR body with idempotent marker comments for safe re-runs (AUT-3777)
335
+ - Added comprehensive smoke tests for back-merge co-change pipeline glue
336
+
337
+ ### 🔧 Changed
338
+
339
+ - Back-merge co-change step now uses `coChangePipeline()` orchestrator instead of the standalone `inject-co-change.js` tool — stages and commits Library changes as a separate `chore(library)` commit
340
+ - Updated Library README with full `coChangePipeline()` documentation including sequence diagram, consumer contract, mode reference, and limitations
341
+
342
+ ### 🐛 Fixed
343
+
344
+ - Fixed false-positive linter warnings (#174)
345
+
346
+ ### 🗑️ Removed
347
+
348
+ - Removed legacy `inject-co-change.js` tool invocation from back-merge post-push step, replaced by integrated pipeline
349
+
350
+ ## [2.57.1] - 2026-05-29
351
+
352
+ ### 🐛 Fixed
353
+
354
+ - Filtered ESLint meta-warnings for ignored files that produced false-positive linter output
355
+ - Fixed co-change pipeline injection result not being captured when running in inject mode
356
+
357
+ ### 🗑️ Removed
358
+
359
+ - Removed `createPrPipeline()` Library maintenance orchestrator and associated M6 documentation
360
+
361
+ ## [2.57.0] - 2026-05-28
362
+
363
+ ### ✨ Added
364
+
365
+ - Added `createPrPipeline()` 5-step Library maintenance orchestrator for the `create-pr` command — runs staleness detection, auto-section regeneration, book add/remove/rename, frontmatter sync, and gotcha solicitation sequentially (AUT-3736)
366
+ - Added comprehensive pipeline documentation to Library README including sequence diagram, consumer contract, and return shape
367
+
368
+ ### 🔧 Changed
369
+
370
+ - Integrated Library maintenance pipeline into `create-pr` command — now triggers full book sync instead of only reporting staleness (AUT-3736)
371
+ - Updated Library milestone status: M5 (core hypothesis validation) marked as shipped, M6 (lifecycle automation) added as in-progress
372
+ - Removed unused variables in `co-change-pipeline.js` (`injectionResult`), `cross-ref-injector.js` (`fileContents`), and renamed unused parameter in `gotcha-persistence.js` (`opts` → `_opts`)
373
+ - Replaced string concatenation with template literals in `gotcha-persistence.js`
374
+
375
+ ## [2.56.0] - 2026-05-28
376
+
377
+ ### ✨ Added
378
+
379
+ - Added candidate gotcha text generator for librarian books — calls Claude API to propose non-obvious tribal knowledge from PR descriptions, commit messages, and source comments (AUT-3735)
380
+ - Added gotcha persistence module for appending accepted gotchas below the manual-additions separator in book files, with idempotency and frontmatter flagging when the API is unreachable (AUT-3735)
381
+ - Added co-change analysis pipeline (#170)
382
+
383
+ ## [2.55.0] - 2026-05-27
384
+
385
+ ### ✨ Added
386
+
387
+ - Added co-change detector that parses git history within a configurable window, computes co-occurrence weighted edges between file pairs, and filters by confidence thresholds (AUT-3740)
388
+ - Added cross-reference injector that updates book frontmatter with co-change cross-references, supporting bidirectional refs for regular books and directional used_by refs for utility books (AUT-3740)
389
+ - Added co-change pipeline orchestrator that runs the full 5-step sequence: detection, mode resolution, sidecar write, optional injection, and markdown analysis report generation (AUT-3740)
390
+ - Added comprehensive unit and idempotency tests for co-change pipeline and cross-ref injector (AUT-3740)
391
+
392
+ ### 🔧 Changed
393
+
394
+ - Replaced string concatenation with template literal in co-change-mode sidecar writer (lint fix)
395
+
396
+ ## [2.54.1] - 2026-05-27
397
+
398
+ ### ✨ Added
399
+
400
+ - Added comprehensive test suite for librarian console API covering isTTY, selectOne, selectMany, confirm, and freeText functions (AUT-3756)
401
+ - Added gotcha solicitation usage example demonstrating the console API interactive workflow (AUT-3756)
402
+
403
+ ## [2.54.0] - 2026-05-27
404
+
405
+ ### ✨ Added
406
+
407
+ - Co-change mode dispatcher for the back-merge pipeline with two modes: `collect-only` (edge accumulation) and `inject` (cross-reference writing), with automatic transition after a configurable threshold of 5 back-merges (AUT-3772)
408
+ - Sidecar state file (`.library/maps/co-change-state.json`) for persisting co-change edges, back-merge counts, and transition configuration across pipeline runs
409
+ - CLI override support (`--co-change-mode=collect-only|inject`) for per-invocation mode control without mutating sidecar state
410
+ - Schema validation, append-only edge merging, and alphabetical edge normalization for deterministic sidecar diffs
411
+ - Comprehensive unit tests for co-change mode dispatcher covering constants, validation, I/O, edge operations, mode resolution, and cold-start behavior
412
+
413
+ ### 🔧 Changed
414
+
415
+ - Updated back-merge documentation to reflect co-change edge collection and conditional injection via mode dispatcher (#167)
416
+
417
+ ## [2.53.0] - 2026-05-27
418
+
419
+ ### ✨ Added
420
+
421
+ - Added post-regen review pass that uses Claude CLI to suggest manual-section improvements based on auto-section changes (#166)
422
+ - Added `--no-review` flag to `regenerate` and `report` commands to skip the Claude review step
423
+ - Added `line-diff.js` — pure-function line-based diff utility for LLM consumption (no shell dependencies)
424
+ - Added `llm.js` — thin Claude CLI wrapper with availability check and graceful degradation
425
+ - Added `review-pass.js` — interactive review workflow: Accept / Edit / Skip / Skip-all per suggestion
426
+
427
+ ### 🔧 Changed
428
+
429
+ - Enriched `regenerate()` output with `diff_context` (old/new auto-section, manual section, source file) for changed books
430
+ - Updated `report` command to include the review pass as Step 2b in the full maintenance cycle
431
+ - Renumbered execution prompt steps (overflow check → Step 4, gotcha solicitation → Step 5, report → Step 6) to accommodate the new review step
432
+
433
+ ## [2.52.0] - 2026-05-27
434
+
435
+ ### ✨ Added
436
+
437
+ - Interactive console primitive for the librarian, enabling programmatic library access (AUT-3734)
438
+ - Comprehensive I/O documentation, execution flows, cross-references, and gotchas for library books: analysis-engine, analyze-diff, analyze-pr, authorization, bump-version (AUT-3734)
439
+
440
+ ### 🔧 Changed
441
+
442
+ - ESLint configuration now includes `.library/librarian/**` in linting scope
443
+
444
+ ### 🐛 Fixed
445
+
446
+ - Fixed bump-version issue (#165)
447
+ - Fixed inaccuracies in library book documentation (AUT-3734)
448
+
8
449
  ## [2.51.2] - 2026-05-26
9
450
 
10
451
  ### 🔧 Changed
452
+
11
453
  - Made library integration visible in CLI (#164)
12
454
 
13
455
  ### 🐛 Fixed
14
- - Fixed partial file selection during version bump — `updateVersionFiles` no longer silently skips unselected files; callers now filter before calling, ensuring only user-selected files are bumped (AUT-3733)
15
456
 
457
+ - Fixed partial file selection during version bump — `updateVersionFiles` no longer silently skips unselected files; callers now filter before calling, ensuring only user-selected files are bumped (AUT-3733)
16
458
 
17
459
  ## [2.51.1] - 2026-05-25
18
460
 
19
461
  ### ✨ Added
462
+
20
463
  - Specification guide (SPEC_GUIDE.md) — a practitioner's guide to building a Code Knowledge Library, covering setup, schema, taxonomy, maintenance, and worked examples (AUT-3722)
21
464
  - Overlap-check tool for detecting book content overlap, closing Library milestone M4 (AUT-3722, #162)
22
465
  - Maps/ artifacts (dependency graph, co-change seeds) surfaced via librarian module for programmatic access (AUT-3722)
23
466
 
24
467
  ### 🔧 Changed
468
+
25
469
  - Rewrote Library README as a specification-oriented guide with clearer structure, worked examples, milestone status tracking, and getting-started table (AUT-3722)
26
470
  - Rewrote CLAUDE.md Library section to align with specification guide format and reference SPEC_GUIDE.md (AUT-3722)
27
471
  - Made Library integration visible in CLI output so users can discover library-powered features (#163)
28
472
 
29
-
30
473
  ## [2.51.0] - 2026-05-25
31
474
 
32
475
  ### ✨ Added
476
+
33
477
  - Added unified Library CLI at `.library/bin/library` with commands: check, regenerate, extract, tokens, graph, inject, validate, report (AUT-3272)
34
478
  - Added centralized path resolution module (`.library/paths.js`) with resolver.yaml parser for repository-agnostic Library adoption
35
479
  - Added Library CLI command registry (`.library/cli.js`) following the same pattern as `lib/cli-metadata.js`
@@ -44,6 +488,7 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
44
488
  - Added co-change references to books via PR #161 (AUT-3315)
45
489
 
46
490
  ### 🔧 Changed
491
+
47
492
  - Refactored all Library tools (`staleness.js`, `generate-graph.js`, `inject-co-change.js`, `measure-tokens.js`, `extract.js`, `librarian/index.js`) to use centralized `paths.js` instead of per-tool `__dirname` arithmetic (AUT-3272)
48
493
  - Rewrote `.library/README.md` with adoption guide, command reference, book schema documentation, and automated maintenance via git hooks section
49
494
  - Replaced legacy npm scripts (`library:tokens`, `library:graph`, `library:extract-poc`, `library:inject-co-change`) with unified CLI-routed equivalents
@@ -53,112 +498,122 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
53
498
  - Rewrote CLAUDE.md Library section to reference the Specification Guide instead of duplicating Library documentation (AUT-3722)
54
499
  - Closed M4 milestone — resolved OPEN items 1–5 in SPEC_GUIDE § 13 with evidence and deferral justifications (AUT-3722)
55
500
 
56
-
57
501
  ## [2.50.0] - 2026-05-20
58
502
 
59
503
  ### ✨ Added
504
+
60
505
  - Added co-change reference tracking to library books — frontmatter now includes `co_change_references` with commit counts, confidence scores, and trigger descriptions for files that historically change together (AUT-3315)
61
506
  - Added `CO_CHANGE_SEEDS.md` co-change seed patterns document with 4 architectural coupling patterns mined from 6 months of git history (AUT-3315)
62
507
  - Added `inject-co-change.js` CLI tool to inject co-change references from seed patterns into book frontmatter, with `--dry-run`, `--json`, and `--seeds` options (AUT-3315)
63
508
  - Added librarian module for automated library maintenance pipeline (#160)
64
509
 
65
510
  ### 🔧 Changed
511
+
66
512
  - Moved staleness detection scripts from `.library/maintenance/` to `.library/tools/` directory (AUT-3315)
67
513
  - Updated `.library/maps/` directory scope to include co-change seeds and token reports (AUT-3315)
68
514
  - Updated `.library/tools/` directory scope to cover all standalone CLI utilities — staleness, graph, tokens, and co-change injection (AUT-3315)
69
515
 
70
-
71
516
  ## [2.49.0] - 2026-05-19
72
517
 
73
518
  ### ✨ Added
519
+
74
520
  - Librarian module for Library maintenance pipeline with five core functions: fetch, regenerate, checkOverflow, solicitGotchas, and buildReport (AUT-3309)
75
521
  - Execution prompt for running full regeneration cycles via Sonnet sessions (AUT-3309)
76
522
  - Report template for structured maintenance cycle output (AUT-3309)
77
523
  - Staleness detector for tracking book drift via AST hash comparison (#159, AUT-3307)
78
524
 
79
525
  ### 🔧 Changed
526
+
80
527
  - Renamed librarian `fetch` export to `fetchLibraryContent` for clarity (AUT-3309)
81
528
  - Updated Library README with comprehensive documentation covering auto-generation, staleness detection, librarian module, and maintenance workflow
82
529
  - Book schema `generated_from` field now supports AST hash format (`ast:sha256:<hex>`) for staleness tracking
83
530
  - Library book count updated from 26 to 70 reflecting auto-generated coverage
84
531
 
85
-
86
532
  ## [2.48.0] - 2026-05-19
87
533
 
88
534
  ### ✨ Added
535
+
89
536
  - Added staleness detector for library books to identify outdated documentation (AUT-3307)
90
537
 
91
538
  ### 🗑️ Removed
92
- - Removed extractor evaluation artifacts (PARSER_DECISION.md, QUALITY_GAP.md) after library auto-update evaluation completed (#158, AUT-3305)
93
539
 
540
+ - Removed extractor evaluation artifacts (PARSER_DECISION.md, QUALITY_GAP.md) after library auto-update evaluation completed (#158, AUT-3305)
94
541
 
95
542
  ## [2.47.1] - 2026-05-19
96
543
 
97
544
  ### 🐛 Fixed
545
+
98
546
  - Fixed path normalization in AST extractor for Windows compatibility by using `fileURLToPath()` instead of raw URL pathname and normalizing backslashes in relative paths (AUT-3305)
99
547
  - Fixed cross-platform book file detection in help catalog by using regex path separator matching instead of literal forward slash
100
548
 
101
-
102
549
  ## [2.47.0] - 2026-05-19
103
550
 
104
551
  ### ✨ Added
552
+
105
553
  - Quality gap report and batch runner for the AST documentation extractor (AUT-3305)
106
554
  - "preserve-if-filled" strategy for the AST extractor to retain manually-written book sections during regeneration (AUT-3305)
107
555
 
108
556
  ### 🔧 Changed
109
- - Regenerated all library book documentation from AST extractor output, replacing manually-maintained books with accurate cross-references and call signatures (AUT-3305, PR #157)
110
557
 
558
+ - Regenerated all library book documentation from AST extractor output, replacing manually-maintained books with accurate cross-references and call signatures (AUT-3305, PR #157)
111
559
 
112
560
  ## [2.46.0] - 2026-05-18
113
561
 
114
562
  ### ✨ Added
563
+
115
564
  - Added AST extractor POC with JavaScript and Python language adapters (AUT-3273)
116
565
  - Added source-to-book auto-section generator for automated library documentation (AUT-3273)
117
566
  - Generated book stubs for 40 source modules in `.library/books/` (AUT-3273)
118
567
  - Added centralized configuration registry (`config-registry.js` + `defaults.json`) with remote override support (#156, ISSUE-138)
119
568
 
120
569
  ### 🔧 Changed
570
+
121
571
  - Configuration merge priority expanded from 4 to 5 layers, adding remote `settings.json` team-policy overrides (#156)
122
572
  - Orchestrator model, threshold, and timeout are now configurable via remote `settings.json` instead of hardcoded values (#156)
123
573
  - Judge timeout now configurable via remote `settings.json` (#156)
124
574
  - Updated library README and shelf indexes to reflect new book count (AUT-3273)
125
575
  - ESLint config updated to include `.library/extractor/` files (AUT-3273)
126
576
 
127
-
128
577
  ## [2.45.0] - 2026-05-13
129
578
 
130
579
  ### ✨ Added
580
+
131
581
  - Added centralized config-registry module with local defaults and remote override support (SUE-138)
132
582
  - Added lib/defaults.json as the single source of truth for all package default values (SUE-138)
133
583
 
134
584
  ### 🔧 Changed
585
+
135
586
  - Replaced inline hardcoded constants across modules with config-registry lookups — judge, orchestrator, Linear connector, model aliases, linter tools, and PR analysis categories now read from defaults.json with remote override capability (SUE-138)
136
587
  - Updated config merge priority to HARDCODED < remote settings.json < defaults < preset < user overrides (SUE-138)
137
588
  - Added config-registry mocks to unit tests for modules consuming centralized defaults (SUE-138)
138
589
 
139
590
  ### 🐛 Fixed
140
- - Fixed Linear ticket fetch issue (#155)
141
591
 
592
+ - Fixed Linear ticket fetch issue (#155)
142
593
 
143
594
  ## [2.44.1] - 2026-05-13
144
595
 
145
596
  ### ✨ Added
597
+
146
598
  - Added unit tests for linear-connector module covering ticket extraction, parsing, token loading, connection testing, and ticket fetching (SUE-154)
147
599
 
148
600
  ### 🐛 Fixed
601
+
149
602
  - Fixed help command to cap book reads at 5 in Pass 2, preventing oversized prompts when the LLM requests too many library books (SUE-154)
150
603
 
151
604
  ### 🗑️ Removed
152
- - Removed CLAUDE-MIGRATION.md — migration map no longer needed after library stabilization
153
605
 
606
+ - Removed CLAUDE-MIGRATION.md — migration map no longer needed after library stabilization
154
607
 
155
608
  ## [2.44.0] - 2026-05-04
156
609
 
157
610
  ### ✨ Added
611
+
158
612
  - New `HELP_NAVIGATE.md` prompt template for the first-pass catalog navigation (SUE-152)
159
613
  - Auto-discovery of `.library/` catalog files (by-code, by-domain, by-task-type shelves) for AI help context
160
614
 
161
615
  ### 🔧 Changed
616
+
162
617
  - Rewrote AI help command to use a two-pass librarian approach navigating local `.library/` instead of single-pass CLAUDE.md lookup (SUE-152)
163
618
  - Pass 1 sends project catalog to Claude; if deeper detail is needed, Pass 2 reads specific book files from local disk — no GitHub API calls
164
619
  - Updated `HELP_QUERY.md` template to accept catalog + book content instead of flat documentation
@@ -167,56 +622,63 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
167
622
  - Updated unit tests to cover two-pass librarian flow, catalog mocking, and book-read scenarios
168
623
 
169
624
  ### 🔒 Security
625
+
170
626
  - Added path traversal protection when reading LLM-requested book paths — resolved paths are verified against the package root before disk access
171
627
 
172
628
  ### 🗑️ Removed
629
+
173
630
  - Removed GitHub API dependency (`fetchFileContent`, `parseGitHubRepo`) from AI help flow — all context is now read from local disk
174
631
  - Removed `readClaudeMd()` single-file reader in favor of `readLibraryCatalog()` multi-file catalog builder
175
632
 
176
-
177
633
  ## [2.43.0] - 2026-04-30
178
634
 
179
635
  ### ✨ Added
636
+
180
637
  - Headless mode for git hooks via CLAUDE_HOOKS_HEADLESS=1 environment variable, routing all LLM calls through the Anthropic SDK instead of the Claude CLI for CI/ECS environments (CT-805)
181
638
  - Unit tests for pre-commit and prepare-commit-msg hooks covering headless mode propagation and error messaging (CT-805)
182
639
 
183
640
  ### 🔧 Changed
641
+
184
642
  - Hook error messages now show SDK-specific guidance ("Check that ANTHROPIC_API_KEY is set") in headless mode and CLI-specific guidance otherwise (CT-805)
185
643
  - Headless flag propagated through full analysis chain: runAnalysis, orchestrateBatches, judgeAndFix, and analyzeCode all accept and forward the headless option (CT-805)
186
644
 
187
645
  ### 🐛 Fixed
646
+
188
647
  - Cross-platform path separator handling in hooks-verified marker test (#150)
189
648
  - Contract documentation test updated to match current CLAUDE.md section heading (#150)
190
649
 
191
-
192
650
  ## [2.42.0] - 2026-04-30
193
651
 
194
652
  ### ✨ Added
653
+
195
654
  - Added `Hooks-Verified: true` Git trailer to commits that pass pre-commit analysis, coordinated via a tree-SHA marker file in `.git/` (CT-802)
196
655
  - Added `hooks-verified-marker.js` utility for marker file CRUD between pre-commit (writes) and prepare-commit-msg (reads/validates/consumes)
197
656
  - Added `getStagedTreeSha()`, `hasHooksVerifiedTrailer()`, and `appendTrailer()` to git-operations for tree fingerprinting and canonical trailer formatting via `git interpret-trailers`
198
657
  - Added hooks-verified marker writing to the `analyze` command when staged-scope analysis completes without critical/blocker issues (CT-802)
199
658
 
200
659
  ### 🔧 Changed
660
+
201
661
  - Reorganized CLAUDE.md project documentation into `.library/` structure with indexed books, shelves, and domain reading lists (#149)
202
662
  - Updated commit-workflow domain reading list and hook books to document the new Hooks-Verified trailer pipeline
203
663
 
204
664
  ### 🐛 Fixed
205
- - Deferred trailer append in prepare-commit-msg until the final message is written, preventing the auto-generated message flow from overwriting the `Hooks-Verified` trailer (CT-802)
206
665
 
666
+ - Deferred trailer append in prepare-commit-msg until the final message is written, preventing the auto-generated message flow from overwriting the `Hooks-Verified` trailer (CT-802)
207
667
 
208
668
  ## [2.41.1] - 2026-04-30
209
669
 
210
670
  ### ✨ Added
671
+
211
672
  - Added headless mode and JSON output support for `analyze`, `create-pr`, and `lint` commands (#148, CT-799)
212
673
 
213
674
  ### 🔧 Changed
214
- - Redistributed CLAUDE.md content into `.library/` — new `conventions.md` coding standards reference, enriched book indexes with key exports, and expanded domain quick-reference tables
215
675
 
676
+ - Redistributed CLAUDE.md content into `.library/` — new `conventions.md` coding standards reference, enriched book indexes with key exports, and expanded domain quick-reference tables
216
677
 
217
678
  ## [2.41.0] - 2026-04-30
218
679
 
219
680
  ### ✨ Added
681
+
220
682
  - Added `--headless` flag to `analyze`, `create-pr`, and `lint` commands for non-interactive CI execution (CT-799)
221
683
  - Added `--format json` output mode that emits a single structured JSON line to stdout, routing all other output to stderr (CT-799)
222
684
  - Added `CostTracker` integration in headless mode for `analyze` and `create-pr` to report Claude API costs in JSON output (CT-799)
@@ -224,42 +686,46 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
224
686
  - Added early fatal guard for detached HEAD state in `create-pr` with actionable fix instructions (CT-804, #147)
225
687
 
226
688
  ### 🔧 Changed
689
+
227
690
  - Updated `interactive-ui.js` display helpers (`showSuccess`, `showError`, `showWarning`, `showInfo`) to delegate to `logger.js`, enabling JSON mode output routing to stderr
228
691
  - Updated `displayLintResults` to accept a `{ silent }` option that suppresses decorative output in JSON mode
229
692
  - Updated `create-pr` headless mode to resolve all 11 interactive decision points with documented defaults (auto-push, squash for unknown strategy, skip tag prompts)
230
693
 
231
-
232
694
  ## [2.40.0] - 2026-04-30
233
695
 
234
696
  ### ✨ Added
697
+
235
698
  - Added early detached HEAD detection in `create-pr` command with actionable error message and remediation steps (CT-804)
236
699
  - Added Operational Contract documentation in CLAUDE.md defining runtime environment requirements for CI/container orchestrators
237
700
  - Added CWD & Branch Contract reference book (`.library/books/cwd-contract.md`) with command-level HEAD tolerance matrix
238
701
  - Added smoke tests to prevent accidental deletion of contract documentation
239
702
 
240
703
  ### 🔧 Changed
704
+
241
705
  - Moved branch detection earlier in `create-pr` flow (before interactive prompts) to fail fast on detached HEAD
242
706
  - Replaced `error()` + `return` with `fatal()` for detached HEAD guard in `create-pr`, ensuring consistent process termination
243
707
 
244
-
245
708
  ## [2.39.0] - 2026-04-29
246
709
 
247
710
  ### ✨ Added
711
+
248
712
  - Added `--headless` flag to `install` command for CI/container environments — skips all side effects: dependency checks, git config, `.gitignore` updates, shell completions, linter availability check, and GitHub token setup (CT-803)
249
713
  - Added `--verify-sdk` flag to `install` command — opt-in 1-token SDK ping (haiku, 10s timeout) to validate `ANTHROPIC_API_KEY` after installation; exits 1 in headless mode on failure, warns in interactive mode (CT-803)
250
714
  - Added `verifySDKConnection()` to `claude-client.js` — minimal SDK connectivity check that delegates to `_executeSDK('ping')` and never throws (CT-803)
251
715
  - Added `--headless` bypass for authorization guard in CLI router — CI runners skip RBAC checks entirely; governance enforced at branch-protection level (CT-803)
252
716
 
253
717
  ### 🔧 Changed
718
+
254
719
  - Install orchestration expanded from 20 to 21 steps to accommodate the new SDK verification step
255
720
 
256
721
  ### ⚠️ Deprecated
257
- - Deprecated `--skip-auth` flag on `install` command — use `--headless` instead for full CI/container mode; logs a deprecation warning when used
258
722
 
723
+ - Deprecated `--skip-auth` flag on `install` command — use `--headless` instead for full CI/container mode; logs a deprecation warning when used
259
724
 
260
725
  ## [2.38.0] - 2026-04-29
261
726
 
262
727
  ### ✨ Added
728
+
263
729
  - Added headless mode (`--headless`) for `analyze-pr` command — skips all interactive prompts for CI/automation pipelines
264
730
  - Added JSON output mode (`--format json`) for `analyze-pr` — emits a single structured JSON document to stdout with verdict, severity counts, comments, and cost data (requires `--headless`)
265
731
  - Added cost tracking for headless `analyze-pr` runs via `CostTracker` integration (#144)
@@ -268,28 +734,30 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
268
734
  - Added JSON mode to logger (`setJSONMode`) — routes `info`/`success`/`warning`/`debug` to stderr, reserving stdout for structured output
269
735
 
270
736
  ### 🔧 Changed
737
+
271
738
  - Changed `error()` in helpers.js to log-only (no longer calls `process.exit`) — callers needing termination should use `fatal()` instead
272
739
  - Changed `bin/claude-hooks` to use `fatal()` for unknown command errors
273
740
  - Changed `helpers.info()`, `helpers.success()`, and `helpers.warning()` to delegate to logger equivalents, respecting JSON mode routing
274
741
 
275
-
276
742
  ## [2.37.0] - 2026-04-29
277
743
 
278
744
  ### ✨ Added
745
+
279
746
  - Added cost tracking for headless SDK calls — per-call USD cost calculation with cache token multipliers, hardcoded Anthropic pricing table, and CloudWatch-friendly structured JSON logs (`cost-tracker.js`)
280
747
  - Added optional Langfuse tracing integration for headless SDK calls — records LLM generations (model, tokens, cost, prompt/response) as traces; disabled by default, activated via `LANGFUSE_ENABLED` env var (`langfuse-tracer.js`)
281
748
  - Added `costTracker` option to `analyzeCode()`, `executeClaudeWithRetry()`, and `executeClaude()` for external cost accumulation across multiple calls
282
749
  - Added `._costs` field to `analyzeCode()` results in headless mode — contains per-call token usage and USD cost snapshot
283
750
 
284
751
  ### 🔧 Changed
752
+
285
753
  - Changed `_executeSDK()` return type from plain text string to `{ text, usage, model }` — callers now receive normalized token usage and resolved model ID
286
754
  - Normalized SDK usage fields with defaults (0 for missing cache token counts) to ensure consistent downstream processing
287
755
  - Updated library documentation with new books for `cost-tracker.js` and `langfuse-tracer.js`, updated `claude-client.js` book with observability details
288
756
 
289
-
290
757
  ## [2.36.0] - 2026-04-28
291
758
 
292
759
  ### ✨ Added
760
+
293
761
  - Added SDK adapter for headless mode in claude-client — dual execution backend: CLI spawn for local/interactive use, or Anthropic SDK direct calls for headless/ECS environments (#141)
294
762
  - Added `_executeSDK()` function for direct Anthropic SDK calls with lazy-loaded `@anthropic-ai/sdk` dependency
295
763
  - Added `resolveModelAlias()` and `MODEL_ALIASES` constant with environment variable overrides (`CLAUDE_MODEL_SONNET`, `CLAUDE_MODEL_OPUS`, `CLAUDE_MODEL_HAIKU`)
@@ -297,21 +765,24 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
297
765
  - Added `claude.defaultModel` to hardcoded config as fallback model for SDK headless mode
298
766
 
299
767
  ### 🔧 Changed
768
+
300
769
  - Changed `analyzeCode()` to return parsed JSON object instead of raw response text
301
770
  - Changed `executeClaude()` to branch between SDK path (when `headless: true`) and CLI spawn path
302
771
  - SDK errors marked with `fromSDK: true` are no longer retried by `withRetry` — the Anthropic SDK already retries internally (2 attempts for rate limits, timeouts, and 5xx)
303
772
  - Updated claude-client library book to document dual-backend architecture, SDK gotchas, and new exports
304
773
 
305
774
  ### 🐛 Fixed
775
+
306
776
  - Fixed Spotless timeouts and cmd.exe per-file mode (#141)
307
777
 
308
778
  ### 🗑️ Removed
309
- - Removed `.library/CATEGORY_COMPLETENESS_REPORT.md` and `.library/CLASSIFICATION_REPORT.md` reports
310
779
 
780
+ - Removed `.library/CATEGORY_COMPLETENESS_REPORT.md` and `.library/CLASSIFICATION_REPORT.md` reports
311
781
 
312
782
  ## [2.35.3] - 2026-04-22
313
783
 
314
784
  ### ✨ Added
785
+
315
786
  - Code Knowledge Library (`.library/`) with 25 reference books covering source modules — structured documentation with call signatures, I/O behavior, cross-references, and gotchas per module (#125-#131)
316
787
  - By-code index for navigating from source file paths to their reference books (`by-code/utils.md`, `by-code/commands.md`, `by-code/hooks.md`)
317
788
  - By-domain index with curated reading lists for four business workflows: commit pipeline, release management, PR analysis, and GitHub integration (`by-domain/`)
@@ -321,24 +792,26 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
321
792
  - Classification report and category completeness report validating all 66 source modules against the 8-category taxonomy
322
793
 
323
794
  ### 🐛 Fixed
324
- - Spotless linting timeouts and cmd.exe per-file mode on Windows — resolves batch-mode failures when Spotless wrapper is a `.cmd`/`.bat` file (#124, #125)
325
795
 
796
+ - Spotless linting timeouts and cmd.exe per-file mode on Windows — resolves batch-mode failures when Spotless wrapper is a `.cmd`/`.bat` file (#124, #125)
326
797
 
327
798
  ## [2.35.2] - 2026-04-13
328
799
 
329
800
  ### ✨ Added
801
+
330
802
  - Added Maven Wrapper (mvnw/mvnw.cmd) auto-detection for Spotless — bypasses cmd.exe metacharacter issues on Windows/WSL2
331
803
  - Added per-file execution mode for Spotless to avoid pipe (`|`) metacharacter in regex arguments on Windows
332
804
  - Added `env` option to `runTool`, `runToolFix`, and `runToolWithAutoFix` for passing extra environment variables to tool invocations
333
805
  - Added `configDir` to `_detectInProjectFiles` return value for downstream Maven Wrapper resolution
334
806
 
335
807
  ### 🐛 Fixed
336
- - Fixed Spotless linter failing on Windows/WSL2 when multiple Java files are staged — `|` (pipe) in the `DspotlessFiles` regex was interpreted as a shell pipe by cmd.exe during batch script expansion
337
808
 
809
+ - Fixed Spotless linter failing on Windows/WSL2 when multiple Java files are staged — `|` (pipe) in the `DspotlessFiles` regex was interpreted as a shell pipe by cmd.exe during batch script expansion
338
810
 
339
811
  ## [2.35.1] - 2026-04-08
340
812
 
341
813
  ### ✨ Added
814
+
342
815
  - Local binary resolution for linter tools — walks up from config directory to repo root, preferring project-installed binaries over npx to prevent version mismatches (#123)
343
816
  - Array-form `detectInProjectFile` for tool detection — Prettier and ESLint now recognized via config files (.prettierrc, .eslintrc.json, eslint.config.js, etc.) in addition to package.json dependencies
344
817
  - WSL2/Windows interop support for .cmd/.bat tool binaries, with proper cmd.exe metacharacter escaping
@@ -346,39 +819,43 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
346
819
  - New `localBin` and `toolCwd` options for `runTool`/`runToolFix`/`runToolWithAutoFix` enabling direct binary execution and correct plugin resolution in monorepos
347
820
 
348
821
  ### 🔧 Changed
822
+
349
823
  - Replaced `execSync` with `execFileSync` in tool-runner — args passed directly to process, preventing shell interpretation of regex metacharacters (e.g., `|` in Spotless patterns) and file path injection
350
824
  - Tool detection now requires project-level configuration when `detectInProjectFile` is defined — PATH-only presence no longer sufficient, preventing false positives (e.g., mvn in PATH treated as Spotless available)
351
825
  - Project file scanning starts from repo root instead of cwd, fixing detection when git hooks run from subdirectories
352
826
  - Increased judge timeout from 120s to 180s
353
827
 
354
828
  ### 🐛 Fixed
829
+
355
830
  - Fixed tool auto-fix being attempted after execution failures (ENOENT, EACCES) by tracking `executionFailed` flag and skipping fix step
356
831
  - Fixed ENOENT handling in `runToolFix` — missing command binary now returns gracefully instead of being misinterpreted as a partial fix
357
832
  - Fixed `git add` in restage step to use `execFileSync` with proper argument array instead of shell string interpolation
358
833
 
359
834
  ### 🔒 Security
835
+
360
836
  - Eliminated shell injection risk in tool execution by switching from `execSync` (shell-based) to `execFileSync` (direct process spawn)
361
837
  - Added `_escapeCmdMeta()` and `_prepareExec()` for safe cmd.exe argument passing when executing .cmd/.bat files on Windows/WSL
362
838
 
363
-
364
839
  ## [2.35.0] - 2026-03-27
365
840
 
366
841
  ### ✨ Added
842
+
367
843
  - Prettier formatting support — auto-formats JS/TS/CSS/HTML/JSON/YAML/MD files before linting (format first, then lint)
368
844
  - Remote formatter configuration — preset-to-tools mapping fetched from centralized git-hooks-config repo, allowing team-wide control without releasing new versions
369
845
  - New `parsePrettierOutput()` function for parsing Prettier --check output into structured issues
370
846
 
371
847
  ### 🔧 Changed
848
+
372
849
  - Linting pipeline now runs formatters (Prettier) before linters (ESLint) for consistent code style
373
850
  - Updated preset-to-tools mapping: frontend, fullstack, ai, and default presets now include Prettier
374
851
  - `getLinterToolsForPreset()` now fetches remote config with local fallback instead of using hardcoded mapping only
375
852
  - `runLinters()` and `checkLinterAvailability()` converted to async functions to support remote config fetching
376
853
  - Unfixable linting issues are now forwarded to the Claude judge for semantic resolution instead of blocking directly
377
854
 
378
-
379
855
  ## [2.34.0] - 2026-03-27
380
856
 
381
857
  ### ✨ Added
858
+
382
859
  - Pre-commit linting with ESLint, Spotless, and sqlfluff - runs before Claude analysis with auto-fix and re-stage
383
860
  - `lint` command - run linters on staged files, directories, or specific files (`claude-hooks lint [paths...]`)
384
861
  - Linter availability check during installation - verifies linter presence per preset and shows install instructions
@@ -387,30 +864,33 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
387
864
  - Maven availability check during installation with install instructions for backend/fullstack presets
388
865
 
389
866
  ### 🔧 Changed
867
+
390
868
  - Pre-commit flow now runs linting before Claude analysis - fast, deterministic checks first
391
869
  - Unfixable lint issues are forwarded to the judge for semantic resolution
392
870
  - Updated documentation to reflect new linting workflow and command usage
393
871
 
394
872
  ### 🐛 Fixed
395
- - WSL Claude CLI detection in non-default distros (#120, #121)
396
873
 
874
+ - WSL Claude CLI detection in non-default distros (#120, #121)
397
875
 
398
876
  ## [2.33.1] - 2026-03-26
399
877
 
400
878
  ### 🔧 Changed
879
+
401
880
  - Improved WSL Claude CLI detection to resolve Claude's path via login shell when installed via nvm or user-scoped npm prefix
402
881
  - Added support for detecting Claude CLI in non-default WSL distros when the default distro is docker-desktop or similar
403
882
  - Switched to execFileSync for WSL distro listing to avoid cmd.exe quote mangling issues
404
883
  - Updated README-NPM with release workflow commands documentation and WSL troubleshooting guide
405
884
 
406
885
  ### 🐛 Fixed
886
+
407
887
  - Fixed Claude CLI not being detected on Windows when running from Git Bash with Claude installed inside WSL via nvm (#120)
408
888
  - Fixed WSL distro detection failing due to UTF-16LE encoding from wsl.exe output
409
889
 
410
-
411
890
  ## [2.33.0] - 2026-03-20
412
891
 
413
892
  ### ✨ Added
893
+
414
894
  - Always-on metrics system for code quality observability (#41) - collects structured JSONL events locally with 90-day retention for trend analysis
415
895
  - Team-based reviewer selection via GitHub Teams API (#115, #36) - automatically resolves team members and excludes PR author when selecting reviewers
416
896
  - New metrics module (`lib/utils/metrics.js`) with fire-and-forget event recording that never blocks callers
@@ -418,19 +898,21 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
418
898
  - Documented proven implementation patterns in CLAUDE.md covering testability, git operations, and architecture best practices
419
899
 
420
900
  ### 🔧 Changed
901
+
421
902
  - Telemetry system now always enabled - removed opt-out toggle for consistent observability
422
903
  - Existing telemetry events dual-write to unified metrics system for consolidated analysis
423
904
  - PR statistics module now records to both legacy JSONL and new metrics system
424
905
  - Judge module switched from telemetry to metrics recording with richer event data including false positives and unresolved issues
425
906
 
426
907
  ### 🗑️ Removed
908
+
427
909
  - Removed `system.telemetry` configuration option - metrics are now always collected locally
428
910
  - Removed telemetry disabled warnings from `batch-info` and `telemetry-cmd` commands
429
911
 
430
-
431
912
  ## [2.32.0] - 2026-03-19
432
913
 
433
914
  ### ✨ Added
915
+
434
916
  - Team-based reviewer selection using GitHub Teams API for Pull Requests (#36)
435
917
  - New `reviewer-selector.js` module for intelligent team member resolution with PR author exclusion
436
918
  - Support for `teamSlug` configuration in `config.github.pr` (defaults to 'automation')
@@ -438,6 +920,7 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
438
920
  - New GitHub API methods: `listRepoTeams()` and `listTeamMembers()` for team resolution
439
921
 
440
922
  ### 🔧 Changed
923
+
441
924
  - PR reviewer selection now prioritizes GitHub Teams API over CODEOWNERS file
442
925
  - Updated `createPullRequest()` to accept `teamReviewers` parameter for team-based review requests
443
926
  - Refactored `github-client.js` to focus on config-based fallback reviewers only
@@ -445,18 +928,18 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.h
445
928
  - Updated documentation to reflect team-based reviewer workflow in CLAUDE.md and README files
446
929
 
447
930
  ### 🗑️ Removed
931
+
448
932
  - CODEOWNERS file parsing and resolution logic from reviewer selection workflow
449
933
  - Methods `readCodeowners()` and `parseCodeownersReviewers()` from `github-client.js`
450
934
 
451
-
452
935
  ## [2.31.1] - 2026-03-19
453
936
 
454
937
  ### 🔧 Changed
938
+
455
939
  - Migrated authorization config repository from `claude-hooks-config` to `git-hooks-config` as the definitive source for permissions and labels
456
940
  - Centralized existing permissions and labels configuration in the definitive repository
457
941
  - Updated documentation in CLAUDE.md to reference the new `git-hooks-config` repository and document team-wide remote config pattern
458
942
 
459
-
460
943
  ## [2.31.0] - 2026-03-19
461
944
 
462
945
  ### ✨ Added