From 2ff8f2499ced9c0863beb2e291dc8e1231e911b1 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 09:20:38 +0000 Subject: [PATCH 1/2] =?UTF-8?q?chore(hooks):=20full=20attribution=20block?= =?UTF-8?q?=20=E2=80=94=20Co-Authored-By,=20Claude-Session,=20Generated-Wi?= =?UTF-8?q?th=20(v3.0.12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XT6iUWaQgahXDB9TWX9Bq7 Generated-With: Claude Code 2.1.42 --- .githooks/README.md | 2 +- .githooks/prepare-commit-msg | 34 ++++++++++++++++++++++++---------- CHANGELOG.md | 9 +++++++++ CLAUDE.md | 9 ++++++--- data_masking.py | 2 +- datamasking/_version.py | 2 +- docs/INSTALL.md | 13 ++++++++++--- 7 files changed, 52 insertions(+), 19 deletions(-) diff --git a/.githooks/README.md b/.githooks/README.md index e875091..9de5672 100644 --- a/.githooks/README.md +++ b/.githooks/README.md @@ -9,6 +9,6 @@ git config core.hooksPath .githooks | Хук | Що робить | |---|---| -| `prepare-commit-msg` | Якщо коміт робиться з сесії Claude Code (змінна `CLAUDECODE`), додає в кінець повідомлення `Co-Authored-By: Claude Fable 5.1 `. Ідемпотентно; merge/squash не чіпає. Співавтора можна перевизначити: `git config claude.coauthor "Name "`. | +| `prepare-commit-msg` | Якщо коміт робиться з сесії Claude Code (змінна `CLAUDECODE`), додає в кінець повідомлення повний блок атрибуції:
`Co-Authored-By: Claude Fable 5.1 `
`Claude-Session: https://claude.ai/code/session_` (з `CLAUDE_CODE_REMOTE_SESSION_ID`)
`Generated-With: Claude Code ` (з `CLAUDE_CODE_VERSION`).
Ідемпотентно; merge/squash не чіпає. Співавтора можна перевизначити: `git config claude.coauthor "Name "`. | Вимкнути назад: `git config --unset core.hooksPath`. diff --git a/.githooks/prepare-commit-msg b/.githooks/prepare-commit-msg index 6702317..e785875 100755 --- a/.githooks/prepare-commit-msg +++ b/.githooks/prepare-commit-msg @@ -1,20 +1,24 @@ #!/bin/sh -# prepare-commit-msg — додає трейлер співавторства до коміту, коли коміт -# робиться з сесії Claude Code (у її оточенні є змінна CLAUDECODE). +# prepare-commit-msg — додає повний блок атрибуції до коміту, коли коміт +# робиться з сесії Claude Code (у її оточенні є змінна CLAUDECODE): +# +# Co-Authored-By: Claude Fable 5.1 +# Claude-Session: https://claude.ai/code/session_ (якщо відомо) +# Generated-With: Claude Code (якщо відомо) # # Активація (один раз на клон): # git config core.hooksPath .githooks # -# Ідемпотентно: якщо трейлер уже є (наприклад, переданий через -# `git commit --trailer ...` або в тексті -m), другий не додається. -# Для merge/squash-комітів і rebase нічого не робить. +# Ідемпотентно: трейлер, що вже є (переданий через `git commit --trailer` +# або в тексті -m), другий раз не додається. Для merge/squash-комітів нічого +# не робить. # # Перевизначити співавтора: git config claude.coauthor "Name " MSG_FILE="$1" SOURCE="$2" -# Лише для звичайних комітів (не merge, не squash, не amend через rebase) +# Лише для звичайних комітів (не merge, не squash) case "$SOURCE" in merge|squash) exit 0 ;; esac @@ -25,7 +29,17 @@ esac COAUTHOR="$(git config --get claude.coauthor 2>/dev/null)" [ -n "$COAUTHOR" ] || COAUTHOR="Claude Fable 5.1 " -git interpret-trailers --in-place \ - --if-exists doNothing \ - --trailer "Co-Authored-By: $COAUTHOR" \ - "$MSG_FILE" +set -- --in-place --if-exists doNothing --trailer "Co-Authored-By: $COAUTHOR" + +# Посилання на сесію: CLAUDE_CODE_REMOTE_SESSION_ID має вигляд cse_, +# а публічний URL сесії — https://claude.ai/code/session_ +if [ -n "$CLAUDE_CODE_REMOTE_SESSION_ID" ]; then + SESSION_ID="${CLAUDE_CODE_REMOTE_SESSION_ID#cse_}" + set -- "$@" --trailer "Claude-Session: https://claude.ai/code/session_${SESSION_ID}" +fi + +if [ -n "$CLAUDE_CODE_VERSION" ]; then + set -- "$@" --trailer "Generated-With: Claude Code ${CLAUDE_CODE_VERSION}" +fi + +git interpret-trailers "$@" "$MSG_FILE" diff --git a/CHANGELOG.md b/CHANGELOG.md index 3af74ed..2d4f36f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [3.0.12] - 2026-09 + +### Changed — tooling +- `prepare-commit-msg` hook now writes the full attribution block instead + of a single line: `Co-Authored-By`, `Claude-Session` (URL derived from + `CLAUDE_CODE_REMOTE_SESSION_ID`) and `Generated-With: Claude Code ` + (from `CLAUDE_CODE_VERSION`); each trailer is added only if missing. + Documented in `.githooks/README.md`, `docs/INSTALL.md`, `CLAUDE.md`. + ## [3.0.11] - 2026-09 ### Changed — tooling diff --git a/CLAUDE.md b/CLAUDE.md index f9370a7..b88406b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -20,12 +20,15 @@ pip install -e '.[full]' && pip install -r requirements-dev.txt - **Кожен коміт бампає patch-версію** у двох місцях: `datamasking/_version.py` та літерал `__version__` у `data_masking.py` (CI звіряє їх). Плюс запис у `CHANGELOG.md` під новим `## [X.Y.Z]`. -- Трейлери в кінці повідомлення (хук додає `Co-Authored-By`, якщо - `core.hooksPath` увімкнено; інакше — вручну): +- Трейлери в кінці повідомлення — повний блок атрибуції (хук додає його + сам, якщо `core.hooksPath` увімкнено; інакше — вручну): ``` Co-Authored-By: Claude Fable 5.1 - Claude-Session: + Claude-Session: https://claude.ai/code/session_ + Generated-With: Claude Code ``` + (`` — `CLAUDE_CODE_REMOTE_SESSION_ID` без префікса `cse_`; + версія — `CLAUDE_CODE_VERSION`.) - Ніяких ідентифікаторів моделі в коді, коментарях чи PR-описах — лише в трейлері. ## Робочий процес diff --git a/data_masking.py b/data_masking.py index 53f0afe..e516ed2 100644 --- a/data_masking.py +++ b/data_masking.py @@ -31,7 +31,7 @@ # Re-exports from masking package for backward compatibility # ============================================================================ -__version__ = "3.0.11" +__version__ = "3.0.12" from datamasking.masking.constants import ( __version__, __author__, __contact__, __phone__, __license__, __year__, diff --git a/datamasking/_version.py b/datamasking/_version.py index 8abf9b7..f5b1f5b 100644 --- a/datamasking/_version.py +++ b/datamasking/_version.py @@ -9,4 +9,4 @@ (і не тягнучи faker під час збірки). """ -__version__ = "3.0.11" +__version__ = "3.0.12" diff --git a/docs/INSTALL.md b/docs/INSTALL.md index 4abe0a0..73047d6 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -184,9 +184,16 @@ Enable them once per clone: git config core.hooksPath .githooks ``` -`prepare-commit-msg` appends `Co-Authored-By: Claude Fable 5.1 ` -to commits made from a Claude Code session (detected via the `CLAUDECODE` -environment variable); it is idempotent and leaves merge/squash commits alone. +`prepare-commit-msg` appends the attribution block to commits made from a Claude +Code session (detected via the `CLAUDECODE` environment variable): + +``` +Co-Authored-By: Claude Fable 5.1 +Claude-Session: https://claude.ai/code/session_ +Generated-With: Claude Code +``` + +It is idempotent and leaves merge/squash commits alone. Override the co-author with `git config claude.coauthor "Name "`. --- From 67415b21ed6c0f60995c9d65ef57ef5d8c17264e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 8 Sep 2026 09:22:54 +0000 Subject: [PATCH 2/2] docs(CLAUDE.md): persistent working branch, PRs merged with merge commits instead of squash (v3.0.13) Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01XT6iUWaQgahXDB9TWX9Bq7 Generated-With: Claude Code 2.1.42 --- CHANGELOG.md | 7 +++++++ CLAUDE.md | 24 ++++++++++-------------- data_masking.py | 2 +- datamasking/_version.py | 2 +- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d4f36f..af86905 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [3.0.13] - 2026-09 + +### Changed — tooling +- `CLAUDE.md`: back to a single persistent working branch; PRs are merged + with a merge commit (not squash) so the branch is marked merged and the + merges are visible in the `main` graph — no branch deletion needed. + ## [3.0.12] - 2026-09 ### Changed — tooling diff --git a/CLAUDE.md b/CLAUDE.md index b88406b..9124fda 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -33,24 +33,20 @@ pip install -e '.[full]' && pip install -r requirements-dev.txt ## Робочий процес -1. Гілка розробки — тимчасова, одна на задачу, з фіксованим ім'ям - `claude/refactor-data-masking-lIcWN`: створюється від `origin/main` - (`git checkout -B claude/refactor-data-masking-lIcWN origin/main`), після - squash-мержу PR має зникнути з origin, щоб між задачами лишався лише - `main`. **Видалити її з цього середовища неможливо** — проксі відхиляє - `git push --delete` (як і теги), а GitHub API-інструменти видалення гілок - не мають. Тому видалення робить GitHub: у репозиторії має бути ввімкнено - Settings → General → Pull Requests → *Automatically delete head branches* - (або власник видаляє гілку вручну на сторінці Branches). Не намагатись - видаляти гілку з Claude Code — це марно. Наступна задача створює гілку - знову від актуального `main` (force-push поверх старої, якщо GitHub її - ще не прибрав, — нормально: вона містить лише вже змержену історію). +1. Гілка розробки — **постійна**: `claude/refactor-data-masking-lIcWN`. + Перед новою задачею синхронізувати з `main` + (`git fetch origin main && git checkout -B claude/refactor-data-masking-lIcWN origin/main`). + Гілку не видаляти і не пересоздавати (проксі не пропускає `push --delete`, + та й потреби немає: PR мержаться merge-комітом, тож після мержу гілка — + предок `main`, а не «побічна»). 2. Перед комітом: `python -m pytest tests/ -q -p no:cacheprovider`, `python -m mypy datamasking/ --config-file mypy.ini` (має бути 0 помилок — джоба blocking), `flake8 . --select=E9,F63,F7,F82`. 3. Push → PR у `main` → дочекатись **зеленого CI на всій матриці** - (Linux 3.9/3.11/3.13, Windows 3.12, core-only, package, mypy) → squash-merge - (гілку прибирає GitHub, п. 1). + (Linux 3.9/3.11/3.13, Windows 3.12, core-only, package, mypy) → + **merge-коміт (`merge_method: merge`), НЕ squash**: так GitHub позначає + гілку як merged, а в графі `main` видно кожен merge. Після мержу — + синхронізувати гілку з `main` (п. 1). 4. Стежити за CI через GitHub API за **повним SHA** (`?head_sha=<40 hex>`); скорочений SHA API ігнорує. 5. **Теги через проксі не пушаться** — релізи створює користувач вручну diff --git a/data_masking.py b/data_masking.py index e516ed2..1583e0e 100644 --- a/data_masking.py +++ b/data_masking.py @@ -31,7 +31,7 @@ # Re-exports from masking package for backward compatibility # ============================================================================ -__version__ = "3.0.12" +__version__ = "3.0.13" from datamasking.masking.constants import ( __version__, __author__, __contact__, __phone__, __license__, __year__, diff --git a/datamasking/_version.py b/datamasking/_version.py index f5b1f5b..7379aa5 100644 --- a/datamasking/_version.py +++ b/datamasking/_version.py @@ -9,4 +9,4 @@ (і не тягнучи faker під час збірки). """ -__version__ = "3.0.12" +__version__ = "3.0.13"