Skip to content

Commit 5fa0bf7

Browse files
committed
1.0.17
1 parent 99a327b commit 5fa0bf7

3 files changed

Lines changed: 288 additions & 0 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
15+
- name: Setup Node
16+
uses: actions/setup-node@v4
17+
with:
18+
node-version: '20'
19+
cache: 'npm'
20+
21+
- name: Install dependencies
22+
run: npm ci
23+
24+
- name: Lint
25+
run: npm run lint --if-present
26+
27+
- name: Build extension
28+
run: npm run package
29+
30+
- name: Package VSIX (dry run)
31+
run: npx vsce package --no-dependencies -o claude-git-commit-ci.vsix
32+
33+
- name: Upload VSIX artifact
34+
uses: actions/upload-artifact@v4
35+
with:
36+
name: vsix-${{ github.sha }}
37+
path: claude-git-commit-ci.vsix
38+
retention-days: 7

‎.github/workflows/release.yml‎

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*.*.*'
7+
workflow_dispatch:
8+
inputs:
9+
version:
10+
description: 'Version to release (e.g. 1.0.17). Leave empty to use package.json'
11+
required: false
12+
type: string
13+
publish:
14+
description: 'Publish to VS Code Marketplace'
15+
required: false
16+
type: boolean
17+
default: true
18+
19+
permissions:
20+
contents: write
21+
22+
jobs:
23+
release:
24+
runs-on: ubuntu-latest
25+
steps:
26+
- name: Checkout
27+
uses: actions/checkout@v4
28+
with:
29+
fetch-depth: 0
30+
31+
- name: Setup Node
32+
uses: actions/setup-node@v4
33+
with:
34+
node-version: '20'
35+
cache: 'npm'
36+
37+
- name: Install dependencies
38+
run: npm ci
39+
40+
- name: Resolve version
41+
id: version
42+
run: |
43+
if [ "${{ github.event_name }}" = "push" ]; then
44+
VERSION="${GITHUB_REF_NAME#v}"
45+
elif [ -n "${{ inputs.version }}" ]; then
46+
VERSION="${{ inputs.version }}"
47+
else
48+
VERSION=$(node -p "require('./package.json').version")
49+
fi
50+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
51+
echo "tag=v$VERSION" >> "$GITHUB_OUTPUT"
52+
echo "Resolved version: $VERSION"
53+
54+
- name: Sync package.json version
55+
run: |
56+
CURRENT=$(node -p "require('./package.json').version")
57+
TARGET="${{ steps.version.outputs.version }}"
58+
if [ "$CURRENT" != "$TARGET" ]; then
59+
npm version "$TARGET" --no-git-tag-version
60+
fi
61+
62+
- name: Build extension
63+
run: npm run package
64+
65+
- name: Package VSIX
66+
run: npx vsce package --no-dependencies -o "claude-git-commit-${{ steps.version.outputs.version }}.vsix"
67+
68+
- name: Generate release notes
69+
id: notes
70+
run: |
71+
set -e
72+
CURRENT_TAG="${{ steps.version.outputs.tag }}"
73+
PREV_TAG=$(git tag --sort=-v:refname | grep -v "^${CURRENT_TAG}$" | head -n 1 || true)
74+
75+
if [ -z "$PREV_TAG" ]; then
76+
RANGE=""
77+
echo "No previous tag found, using full history"
78+
else
79+
RANGE="${PREV_TAG}..HEAD"
80+
echo "Range: $RANGE"
81+
fi
82+
83+
LOG=$(git log $RANGE --pretty=format:"%H%x09%s%x09%an" --no-merges)
84+
85+
FEATURES=""
86+
FIXES=""
87+
PERF=""
88+
DOCS=""
89+
REFACTOR=""
90+
CHORE=""
91+
OTHER=""
92+
93+
while IFS=$'\t' read -r HASH SUBJECT AUTHOR; do
94+
[ -z "$HASH" ] && continue
95+
SHORT="${HASH:0:7}"
96+
LINE="- ${SUBJECT} (${SHORT})"
97+
case "$SUBJECT" in
98+
feat*|feature*) FEATURES="${FEATURES}${LINE}"$'\n' ;;
99+
fix*) FIXES="${FIXES}${LINE}"$'\n' ;;
100+
perf*) PERF="${PERF}${LINE}"$'\n' ;;
101+
docs*) DOCS="${DOCS}${LINE}"$'\n' ;;
102+
refactor*) REFACTOR="${REFACTOR}${LINE}"$'\n' ;;
103+
chore*|build*|ci*) CHORE="${CHORE}${LINE}"$'\n' ;;
104+
[0-9]*) continue ;;
105+
*) OTHER="${OTHER}${LINE}"$'\n' ;;
106+
esac
107+
done <<< "$LOG"
108+
109+
{
110+
echo "## Claude Git Commit v${{ steps.version.outputs.version }}"
111+
echo ""
112+
[ -n "$FEATURES" ] && { echo "### ✨ Features"; echo ""; echo "$FEATURES"; }
113+
[ -n "$FIXES" ] && { echo "### 🐛 Bug Fixes"; echo ""; echo "$FIXES"; }
114+
[ -n "$PERF" ] && { echo "### ⚡ Performance"; echo ""; echo "$PERF"; }
115+
[ -n "$REFACTOR" ] && { echo "### ♻️ Refactoring"; echo ""; echo "$REFACTOR"; }
116+
[ -n "$DOCS" ] && { echo "### 📝 Documentation"; echo ""; echo "$DOCS"; }
117+
[ -n "$CHORE" ] && { echo "### 🔧 Chores"; echo ""; echo "$CHORE"; }
118+
[ -n "$OTHER" ] && { echo "### 📦 Other"; echo ""; echo "$OTHER"; }
119+
echo ""
120+
echo "### 📥 Installation"
121+
echo ""
122+
echo "Download the \`.vsix\` file below and install via:"
123+
echo '```'
124+
echo "code --install-extension claude-git-commit-${{ steps.version.outputs.version }}.vsix"
125+
echo '```'
126+
if [ -n "$PREV_TAG" ]; then
127+
echo ""
128+
echo "**Full changelog:** https://github.com/${{ github.repository }}/compare/${PREV_TAG}...${CURRENT_TAG}"
129+
fi
130+
} > RELEASE_NOTES.md
131+
132+
echo "---- release notes ----"
133+
cat RELEASE_NOTES.md
134+
135+
- name: Create GitHub Release
136+
uses: softprops/action-gh-release@v2
137+
with:
138+
tag_name: ${{ steps.version.outputs.tag }}
139+
name: ${{ steps.version.outputs.tag }}
140+
body_path: RELEASE_NOTES.md
141+
files: claude-git-commit-${{ steps.version.outputs.version }}.vsix
142+
draft: false
143+
prerelease: false
144+
145+
- name: Publish to VS Code Marketplace
146+
if: ${{ github.event_name == 'push' || inputs.publish }}
147+
env:
148+
VSCE_PAT: ${{ secrets.VSCE_PAT }}
149+
run: |
150+
if [ -z "$VSCE_PAT" ]; then
151+
echo "::warning::VSCE_PAT secret is not set — skipping marketplace publish"
152+
exit 0
153+
fi
154+
npx vsce publish --no-dependencies --packagePath "claude-git-commit-${{ steps.version.outputs.version }}.vsix"

‎CLAUDE.md‎

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# CLAUDE.md
2+
3+
Цей файл містить правила для Claude Code при роботі в цьому репозиторії.
4+
5+
## Про проект
6+
7+
VS Code розширення **Claude Git Commit** — генерує повідомлення комітів через Claude AI (CLI або API). Публікується в VS Code Marketplace під publisher `ZakhariiMelnyk`.
8+
9+
- Точка входу: [src/extension.ts](src/extension.ts)
10+
- Білд: webpack → [dist/extension.js](dist/extension.js)
11+
- Пакування: `vsce``.vsix`
12+
13+
## Коміти — Conventional Commits (обов'язко��о)
14+
15+
Release workflow парсить коміти й групує release notes **за префіксом**. Будь-який коміт без правильного префіксу потрапить у "📦 Other" або буде проігнорований.
16+
17+
**Дозволені префікси** (розпізнає [.github/workflows/release.yml](.github/workflows/release.yml)):
18+
19+
| Префікс | Секція в release notes |
20+
|---|---|
21+
| `feat:` / `feature:` | ✨ Features |
22+
| `fix:` | 🐛 Bug Fixes |
23+
| `perf:` | ⚡ Performance |
24+
| `refactor:` | ♻️ Refactoring |
25+
| `docs:` | 📝 Documentation |
26+
| `chore:` / `build:` / `ci:` | 🔧 Chores |
27+
28+
**Правила:**
29+
- Scope в дужках заохочується: `fix(cli): ...`, `feat(prompts): ...`
30+
- Мова повідомлення — українська (див. попередні коміти), але префікс англійською
31+
- **НЕ** створювати коміти виду `1.0.17` вручну — це робить release workflow. Коміти, що починаються з цифри, ігноруються парсером нотаток
32+
- Merge-коміти виключені з нотаток (`--no-merges`)
33+
- Ніколи не використовувати `--no-verify`, `--amend` на запушених комітах, `git push --force` без явної вказівк�� користувача
34+
35+
## Випуск нової версії
36+
37+
**НЕ робити вручну** крім випадків, коли користувач прямо просить. Стандартний флоу:
38+
39+
1. Переконатися що `main` чистий і CI зелений
40+
2. Підняти версію: `npm version patch|minor|major --no-git-tag-version`
41+
3. Зробити коміт версії (виняток із правила conventional commits — формат `X.Y.Z`, як у попередніх релізах)
42+
4. Створити тег: `git tag vX.Y.Z`
43+
5. Запушити: `git push && git push origin vX.Y.Z`
44+
6. GitHub Actions [release.yml](.github/workflows/release.yml) автоматично:
45+
- Збере `.vsix`
46+
- Згенерує release notes з комітів від попереднього тегу
47+
- Створить GitHub Release з прикріпленим `.vsix`
48+
- Опублікує в Marketplace (якщо секрет `VSCE_PAT` налаштований)
49+
50+
**Альтернатива:** ручний запуск через `workflow_dispatch` в GitHub UI з полем `version`.
51+
52+
**Semver:**
53+
- `patch` — баг-фікси, зміни без впливу на API/поведінку
54+
- `minor` — нові фічі, зворотньо сумісні
55+
- `major` — breaking changes (змінені команди, налаштування, поведінка за замовчуванням)
56+
57+
## GitHub Actions
58+
59+
Два workflow:
60+
61+
### [.github/workflows/ci.yml](.github/workflows/ci.yml)
62+
Запускається на PR та пуш в `main`. Робить: `npm ci` → lint → `npm run package` → dry-run `vsce package`. Артефакт `.vsix` зберігається 7 днів. **Не ламати цей пайплайн** — якщо lint/build падає, виправляти, а не обходити.
63+
64+
### [.github/workflows/release.yml](.github/workflows/release.yml)
65+
Тригери:
66+
- Пуш тегу `v*.*.*`
67+
- Ручний запуск (`workflow_dispatch`) з параметрами `version` і `publish`
68+
69+
Workflow сам синхронізує `package.json` з версією тегу через `npm version --no-git-tag-version`, якщо вони розходяться. Це означає: **якщо ти підняв версію вручну перед тегом — це ок, якщо ні — workflow підтягне сам**.
70+
71+
**Секрети:**
72+
- `VSCE_PAT` — токен для публікації в Marketplace. Якщо не встановлений, workflow лише створить GitHub Release з warning'ом, не впаде.
73+
- `GITHUB_TOKEN` — вбудований, використовується `softprops/action-gh-release` для створення релізу.
74+
75+
### Правила модифікації workflow
76+
- Будь-які зміни в `.github/workflows/**` комітити з префіксом `ci:`
77+
- Не додавати кроки, які роблять `git push` назад у репо без явної потреби (створює ризик інфінітних циклів)
78+
- Якщо змінюєш логіку генерації release notes — переконайся, що парсер коректно обробляє всі 6 типів conventional commits і не ламається на порожньому range (перший реліз)
79+
- Тестувати workflow можна через `workflow_dispatch` перед тим як виливати через тег
80+
81+
## Білд і пакування вручну
82+
83+
```bash
84+
npm run package # webpack production build
85+
npx vsce package # створити .vsix
86+
```
87+
88+
Результат — `claude-git-commit-X.Y.Z.vsix` в корені. `.vsix` файли **закомічені в репозиторій** (історичні релізи) — нові додавати тільки якщо випускаєш вручну без CI.
89+
90+
## Файли, яких НЕ чіпати без потреби
91+
- `package.json` поле `version` — керується релізним процесом
92+
- `.vscodeignore` — впливає на розмір пакета, перевіряти тест-пакуванням після змін
93+
- Історичні `.vsix` в корені — не видаляти без прохання користувача
94+
95+
## Мова
96+
Відповіді користувачу — українською. Префікси комітів, назви змінних, код — англійською.

0 commit comments

Comments
 (0)