kwork-api/site/SEMANTIC_RELEASE/index.html
root 0975b68334 feat: complete Kwork API client with 45+ endpoints
Initial release:
- Complete async API client (45+ endpoints)
- Pydantic models for all responses
- Two-step authentication
- Comprehensive error handling
- 92% test coverage
- Gitea Actions CI/CD
- Semantic release configured
2026-03-29 00:42:54 +00:00

865 lines
33 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Unofficial Python client for Kwork.ru API">
<link rel="canonical" href="https://github.com/claw/kwork-api/SEMANTIC_RELEASE/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Semantic Release — Автоматическое версионирование - Kwork API</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#semantic-release" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Kwork API" class="md-header__button md-logo" aria-label="Kwork API" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Kwork API
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Semantic Release — Автоматическое версионирование
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/claw/kwork-api" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
claw/kwork-api
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../api-reference/" class="md-tabs__link">
API Reference
</a>
</li>
<li class="md-tabs__item">
<a href="../examples.md" class="md-tabs__link">
Examples
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted md-nav--integrated" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Kwork API" class="md-nav__button md-logo" aria-label="Kwork API" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Kwork API
</label>
<div class="md-nav__source">
<a href="https://github.com/claw/kwork-api" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
claw/kwork-api
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../api-reference/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api/client/" class="md-nav__link">
<span class="md-ellipsis">
Client
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api/models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api/errors/" class="md-nav__link">
<span class="md-ellipsis">
Errors
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../examples.md" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="semantic-release">Semantic Release — Автоматическое версионирование<a class="headerlink" href="#semantic-release" title="Permanent link">&para;</a></h1>
<h2 id="_1">📋 Обзор<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<p><strong>python-semantic-release</strong> автоматически определяет версию на основе Conventional Commits.</p>
<p><strong>Как работает:</strong>
<div class="highlight"><pre><span></span><code>Commit → Анализ сообщения → Определение типа → Bump версии → Тег → Релиз
</code></pre></div></p>
<hr />
<h2 id="conventional-commits">🎯 CONVENTIONAL COMMITS<a class="headerlink" href="#conventional-commits" title="Permanent link">&para;</a></h2>
<h3 id="_2"><strong>Формат коммита:</strong><a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>&lt;type&gt;(&lt;scope&gt;): &lt;description&gt;
[optional body]
[optional footer]
</code></pre></div>
<h3 id="_3"><strong>Типы коммитов и влияние на версию:</strong><a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Тип</th>
<th>Влияние</th>
<th>Пример</th>
<th>Версия</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>feat</code></td>
<td><strong>MINOR</strong></td>
<td><code>feat: add new API endpoint</code></td>
<td>0.1.0 → 0.2.0</td>
</tr>
<tr>
<td><code>fix</code></td>
<td><strong>PATCH</strong></td>
<td><code>fix: handle timeout errors</code></td>
<td>0.1.0 → 0.1.1</td>
</tr>
<tr>
<td><code>perf</code></td>
<td><strong>PATCH</strong></td>
<td><code>perf: optimize HTTP requests</code></td>
<td>0.1.0 → 0.1.1</td>
</tr>
<tr>
<td><code>feat</code> + BREAKING</td>
<td><strong>MAJOR</strong></td>
<td><code>feat: change auth method</code></td>
<td>0.1.0 → 1.0.0</td>
</tr>
<tr>
<td><code>docs</code>, <code>style</code>, <code>refactor</code>, <code>test</code>, <code>chore</code>, <code>ci</code>, <code>build</code></td>
<td>Нет</td>
<td><code>docs: update README</code></td>
<td>Без изменений</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="_4">📝 ПРИМЕРЫ КОММИТОВ<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h2>
<h3 id="patch"><strong>PATCH (багфиксы):</strong><a class="headerlink" href="#patch" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;fix: handle 404 error in catalog API&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;fix(auth): restore session from token correctly&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;perf: reduce HTTP connection overhead&quot;</span>
</code></pre></div>
<h3 id="minor"><strong>MINOR (новая функциональность):</strong><a class="headerlink" href="#minor" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: add batch kwork details endpoint&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat(projects): add get_payer_orders method&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: support HTTP/2 for faster requests&quot;</span>
</code></pre></div>
<h3 id="major"><strong>MAJOR (ломающие изменения):</strong><a class="headerlink" href="#major" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: redesign authentication flow</span>
<span class="s2">BREAKING CHANGE: login() now returns KworkClient instead of tuple</span>
<span class="s2">Migration:</span>
<span class="s2"> Before: token, cookies = await login(user, pass)</span>
<span class="s2"> After: client = await KworkClient.login(user, pass)</span>
<span class="s2">&quot;</span>
</code></pre></div>
<h3 id="_5"><strong>Без влияния на версию:</strong><a class="headerlink" href="#_5" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;docs: add usage examples to README&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;test: increase coverage to 95%&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;style: fix formatting with ruff&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;refactor: simplify error handling&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;chore: update dependencies&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;ci: add Gitea Actions workflow&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;build: configure UV build system&quot;</span>
</code></pre></div>
<hr />
<h2 id="workflow">🔄 WORKFLOW<a class="headerlink" href="#workflow" title="Permanent link">&para;</a></h2>
<h3 id="_6"><strong>Разработка:</strong><a class="headerlink" href="#_6" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Делай коммиты по Conventional Commits</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: add new endpoint&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;fix: handle edge case&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;docs: update documentation&quot;</span>
<span class="c1"># Пуш в main</span>
git<span class="w"> </span>push<span class="w"> </span>origin<span class="w"> </span>main
</code></pre></div>
<h3 id="cicd"><strong>CI/CD (автоматически):</strong><a class="headerlink" href="#cicd" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>1. Тесты запускаются
2. Сборка пакета
3. Semantic Release анализирует коммиты
4. Определяет тип версии (MAJOR/MINOR/PATCH)
5. Обновляет версию в pyproject.toml и __init__.py
6. Создаёт Git тег
7. Генерирует CHANGELOG
8. Создаёт релиз в Gitea
9. Публикует пакет в Gitea Registry
</code></pre></div>
<h3 id="_7"><strong>Результат:</strong><a class="headerlink" href="#_7" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>✅ v0.1.1 создан
✅ CHANGELOG.md обновлён
✅ Пакет опубликован
✅ Релиз в Gitea создан
</code></pre></div>
<hr />
<h2 id="_8">🔧 РУЧНОЕ УПРАВЛЕНИЕ<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h2>
<h3 id="_9"><strong>Проверить следующую версию:</strong><a class="headerlink" href="#_9" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="nb">cd</span><span class="w"> </span>/root/kwork-api
uv<span class="w"> </span>run<span class="w"> </span>semantic-release<span class="w"> </span>version<span class="w"> </span>--print
</code></pre></div>
<h3 id="changelog"><strong>Сгенерировать CHANGELOG:</strong><a class="headerlink" href="#changelog" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>uv<span class="w"> </span>run<span class="w"> </span>semantic-release<span class="w"> </span>changelog
</code></pre></div>
<h3 id="_10"><strong>Создать релиз вручную:</strong><a class="headerlink" href="#_10" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Bump версии</span>
uv<span class="w"> </span>run<span class="w"> </span>semantic-release<span class="w"> </span>version<span class="w"> </span>--no-push
<span class="c1"># Проверить что изменилось</span>
git<span class="w"> </span>diff
<span class="c1"># Запушить</span>
git<span class="w"> </span>push<span class="w"> </span>origin<span class="w"> </span>main<span class="w"> </span>--tags
</code></pre></div>
<hr />
<h2 id="_11">📊 ПРИМЕР ИСТОРИИ ВЕРСИЙ<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code>v0.1.0 (2026-03-23)
- Initial release
- Complete API client
- 100% documentation
v0.1.1 (2026-03-24)
- fix: handle timeout errors
- fix: restore session correctly
v0.2.0 (2026-03-25)
- feat: add batch endpoint
- feat: support HTTP/2
v0.2.1 (2026-03-26)
- perf: optimize requests
v1.0.0 (2026-03-27)
- feat: new authentication
- BREAKING CHANGE: API changed
</code></pre></div>
<hr />
<h2 id="_12">⚙️ КОНФИГУРАЦИЯ<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h2>
<p><strong>Файл:</strong> <code>pyproject.toml</code></p>
<div class="highlight"><pre><span></span><code><span class="k">[tool.semantic_release]</span>
<span class="n">version_toml</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;pyproject.toml:project.version&quot;</span><span class="p">]</span>
<span class="n">version_variables</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;src/kwork_api/__init__.py:__version__&quot;</span><span class="p">]</span>
<span class="n">branch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;main&quot;</span>
<span class="n">build_command</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;uv build&quot;</span>
<span class="n">commit_parser</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;angular&quot;</span>
<span class="n">tag_format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;v{version}&quot;</span>
<span class="k">[tool.semantic_release.commit_parser_options]</span>
<span class="n">minor_tags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;feat&quot;</span><span class="p">]</span>
<span class="n">patch_tags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;fix&quot;</span><span class="p">,</span><span class="w"> </span><span class="s2">&quot;perf&quot;</span><span class="p">]</span>
<span class="n">breaking_change_tags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;feat&quot;</span><span class="p">]</span>
<span class="k">[tool.semantic_release.remote]</span>
<span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;gitea&quot;</span>
<span class="n">domain</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;https://git.much-data.ru&quot;</span>
<span class="n">owner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;claw&quot;</span>
<span class="n">repo_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;kwork-api&quot;</span>
</code></pre></div>
<hr />
<h2 id="troubleshooting">🚨 TROUBLESHOOTING<a class="headerlink" href="#troubleshooting" title="Permanent link">&para;</a></h2>
<h3 id="no-commits-to-release"><strong>Ошибка: "No commits to release"</strong><a class="headerlink" href="#no-commits-to-release" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Значит не было коммитов с типами feat/fix/perf</span>
<span class="c1"># Сделай коммит с правильным форматом</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: add something new&quot;</span>
</code></pre></div>
<h3 id="gitea-token-invalid"><strong>Ошибка: "Gitea token invalid"</strong><a class="headerlink" href="#gitea-token-invalid" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Проверь токен</span>
<span class="c1"># Settings → Applications → Create new token</span>
<span class="c1"># Права: write:repository, write:package</span>
<span class="c1"># Обнови секрет в Gitea Actions</span>
</code></pre></div>
<h3 id="_13"><strong>Версия не обновляется</strong><a class="headerlink" href="#_13" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Проверь конфигурацию</span>
uv<span class="w"> </span>run<span class="w"> </span>semantic-release<span class="w"> </span>--version
<span class="c1"># Проверь что __version__ есть в __init__.py</span>
grep<span class="w"> </span><span class="s2">&quot;__version__&quot;</span><span class="w"> </span>src/kwork_api/__init__.py
</code></pre></div>
<hr />
<h2 id="_14">📋 ЧЕКЛИСТ ПЕРЕД ПУШЕМ<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h2>
<ul class="task-list">
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Коммиты по Conventional Commits</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Тесты проходят</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> CHANGELOG обновлён (автоматически)</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> Версия в <strong>init</strong>.py совпадает</li>
<li class="task-list-item"><label class="task-list-control"><input type="checkbox" disabled/><span class="task-list-indicator"></span></label> GITEA_TOKEN настроен в секретах</li>
</ul>
<hr />
<h2 id="best-practices">🎯 BEST PRACTICES<a class="headerlink" href="#best-practices" title="Permanent link">&para;</a></h2>
<h3 id="_15"><strong>✅ Делай:</strong><a class="headerlink" href="#_15" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Атомарные коммиты</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: add user endpoint&quot;</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;fix: handle 404 error&quot;</span>
<span class="c1"># Понятные описания</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;fix: restore session from saved token&quot;</span>
<span class="c1"># Scope для больших изменений</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat(auth): add OAuth2 support&quot;</span>
</code></pre></div>
<h3 id="_16"><strong>Не делай:</strong><a class="headerlink" href="#_16" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code><span class="c1"># Слишком общие</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;fix stuff&quot;</span>
<span class="c1"># Несколько изменений в одном</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;feat: add user endpoint and fix auth and update docs&quot;</span>
<span class="c1"># Не по формату</span>
git<span class="w"> </span>commit<span class="w"> </span>-m<span class="w"> </span><span class="s2">&quot;added new feature&quot;</span>
</code></pre></div>
<hr />
<h2 id="_17">📞 ССЫЛКИ<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h2>
<ul>
<li><a href="https://python-semantic-release.readthedocs.io/">python-semantic-release</a></li>
<li><a href="https://www.conventionalcommits.org/">Conventional Commits</a></li>
<li><a href="https://github.com/angular/angular/blob/main/CONTRIBUTING.md#commit">Angular Commit Guidelines</a></li>
</ul>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["navigation.tabs", "navigation.sections", "toc.integrate", "search.suggest", "search.highlight"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>