s-issuekit 0.2.0__tar.gz → 0.3.0__tar.gz
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.
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/.gitignore +47 -47
- s_issuekit-0.3.0/.gitlab-ci.yml +101 -0
- s_issuekit-0.3.0/.importlinter +68 -0
- s_issuekit-0.3.0/.skillgateignore +12 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/AGENTS.md +45 -45
- s_issuekit-0.3.0/CHANGELOG.md +25 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/PKG-INFO +12 -2
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/README.md +10 -0
- s_issuekit-0.3.0/docs/adr/0000-template.md +20 -0
- s_issuekit-0.3.0/docs/adr/README.md +30 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/__init__.py +3 -1
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/pyproject.toml +1 -1
- s_issuekit-0.3.0/scripts/check_dist_leaks.py +180 -0
- s_issuekit-0.3.0/scripts/release_guard.py +138 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/skills/issuekit/references/writing-good-issues.md +118 -118
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/tests/test_submit.py +117 -117
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/uv.lock +8 -7
- s_issuekit-0.2.0/.gitlab-ci.yml +0 -31
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/LICENSE +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/cli.py +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/data/kinds.json +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/lint.py +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/render.py +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/spec.py +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/issuekit/submit.py +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/skills/issuekit/SKILL.md +0 -0
- {s_issuekit-0.2.0 → s_issuekit-0.3.0}/tests/test_issuekit.py +0 -0
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
# === atlas universal gitignore ===
|
|
2
|
-
|
|
3
|
-
# OS / IDE
|
|
4
|
-
.DS_Store
|
|
5
|
-
Thumbs.db
|
|
6
|
-
.vscode/
|
|
7
|
-
.idea/
|
|
8
|
-
*.swp
|
|
9
|
-
*.swo
|
|
10
|
-
|
|
11
|
-
# Sensitive
|
|
12
|
-
.env
|
|
13
|
-
.env.local
|
|
14
|
-
*.key
|
|
15
|
-
*.pem
|
|
16
|
-
secrets/
|
|
17
|
-
private/
|
|
18
|
-
|
|
19
|
-
# Python
|
|
20
|
-
__pycache__/
|
|
21
|
-
*.py[cod]
|
|
22
|
-
.venv/
|
|
23
|
-
venv/
|
|
24
|
-
.pytest_cache/
|
|
25
|
-
.ruff_cache/
|
|
26
|
-
*.egg-info/
|
|
27
|
-
|
|
28
|
-
# Node / JS
|
|
29
|
-
node_modules/
|
|
30
|
-
.next/
|
|
31
|
-
dist/
|
|
32
|
-
build/
|
|
33
|
-
|
|
34
|
-
# Temporary / large
|
|
35
|
-
*.log
|
|
36
|
-
*.tmp
|
|
37
|
-
nul
|
|
38
|
-
NUL
|
|
39
|
-
*.zip
|
|
40
|
-
*.rar
|
|
41
|
-
*.7z
|
|
42
|
-
|
|
43
|
-
# Media (selectively unignore via !path/*.ext if needed for fixtures)
|
|
44
|
-
*.mp4
|
|
45
|
-
*.mov
|
|
46
|
-
*.avi
|
|
47
|
-
*.mkv
|
|
1
|
+
# === atlas universal gitignore ===
|
|
2
|
+
|
|
3
|
+
# OS / IDE
|
|
4
|
+
.DS_Store
|
|
5
|
+
Thumbs.db
|
|
6
|
+
.vscode/
|
|
7
|
+
.idea/
|
|
8
|
+
*.swp
|
|
9
|
+
*.swo
|
|
10
|
+
|
|
11
|
+
# Sensitive
|
|
12
|
+
.env
|
|
13
|
+
.env.local
|
|
14
|
+
*.key
|
|
15
|
+
*.pem
|
|
16
|
+
secrets/
|
|
17
|
+
private/
|
|
18
|
+
|
|
19
|
+
# Python
|
|
20
|
+
__pycache__/
|
|
21
|
+
*.py[cod]
|
|
22
|
+
.venv/
|
|
23
|
+
venv/
|
|
24
|
+
.pytest_cache/
|
|
25
|
+
.ruff_cache/
|
|
26
|
+
*.egg-info/
|
|
27
|
+
|
|
28
|
+
# Node / JS
|
|
29
|
+
node_modules/
|
|
30
|
+
.next/
|
|
31
|
+
dist/
|
|
32
|
+
build/
|
|
33
|
+
|
|
34
|
+
# Temporary / large
|
|
35
|
+
*.log
|
|
36
|
+
*.tmp
|
|
37
|
+
nul
|
|
38
|
+
NUL
|
|
39
|
+
*.zip
|
|
40
|
+
*.rar
|
|
41
|
+
*.7z
|
|
42
|
+
|
|
43
|
+
# Media (selectively unignore via !path/*.ext if needed for fixtures)
|
|
44
|
+
*.mp4
|
|
45
|
+
*.mov
|
|
46
|
+
*.avi
|
|
47
|
+
*.mkv
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# СГЕНЕРИРОВАНО из devcontour/tools/kits/template/gitlab-ci.yml — не правь здесь.
|
|
2
|
+
# Правка идёт в шаблон, затем `python tools/kits/apply_template.py <кит>`.
|
|
3
|
+
# Сверка: `python tools/kits/apply_template.py <кит> --check` (код 1 при расхождении).
|
|
4
|
+
#
|
|
5
|
+
# Автопубликация на PyPI по семвер-тегу vX.Y.Z через Trusted Publishing (OIDC).
|
|
6
|
+
# Три стадии, и это не украшение: версии на PyPI неизменяемы, и шесть китов
|
|
7
|
+
# уезжали туда без единого теста (browserkit 0.0.18, netkit ≤0.0.12 — оба в бою).
|
|
8
|
+
# gates — тесты, линтер, слои, doctor: на каждый push и на тег
|
|
9
|
+
# release-guard — тег == версия во всех местах (pyproject/uv.lock/CHANGELOG)
|
|
10
|
+
# publish-pypi — только после двух первых; версия, уже лежащая на PyPI, не
|
|
11
|
+
# публикуется повторно (тег «догоняет» выпуск, а не роняет CI);
|
|
12
|
+
# после сборки и до обмена токена — check_dist_leaks.py
|
|
13
|
+
# (личные данные разработчика в собранном дистрибутиве)
|
|
14
|
+
# Токены НИГДЕ не хранятся: GitLab выдаёт короткоживущий OIDC-токен (PYPI_ID_TOKEN),
|
|
15
|
+
# он одноразово обменивается на PyPI API-токен. Издатель настраивается на pypi.org:
|
|
16
|
+
# Manage -> Publishing -> GitLab (namespace=S-kits, project=issuekit,
|
|
17
|
+
# top-level pipeline file=.gitlab-ci.yml, environment — пусто).
|
|
18
|
+
# Дистрибутив на PyPI: s-issuekit.
|
|
19
|
+
stages: [test, guard, publish]
|
|
20
|
+
|
|
21
|
+
.uv:
|
|
22
|
+
image: ghcr.io/astral-sh/uv:python3.12-bookworm
|
|
23
|
+
|
|
24
|
+
gates:
|
|
25
|
+
extends: .uv
|
|
26
|
+
stage: test
|
|
27
|
+
rules:
|
|
28
|
+
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
|
|
29
|
+
- if: $CI_PIPELINE_SOURCE == "push"
|
|
30
|
+
script:
|
|
31
|
+
# dev-зависимости у китов объявлены двумя способами — extra `dev` и группа
|
|
32
|
+
# `[dependency-groups] dev`; --all-extras покрывает первое, группу добавляем
|
|
33
|
+
# только если она объявлена, иначе uv падает «Group dev is not defined».
|
|
34
|
+
- uv sync --all-extras $(python3 -c "import tomllib;print('--group dev' if 'dev' in tomllib.load(open('pyproject.toml','rb')).get('dependency-groups',{}) else '')")
|
|
35
|
+
- uv run pytest tests/ -q
|
|
36
|
+
# Линтер по ВСЕМУ пакету, а не по списку файлов: сужение до «файлов волны 0»
|
|
37
|
+
# держалось девять китов и ни разу не было расширено — сужение приживается,
|
|
38
|
+
# расширение нет.
|
|
39
|
+
- uv run ruff check .
|
|
40
|
+
# Границы слоёв: контракт в .importlinter (ставится тем же шаблоном).
|
|
41
|
+
# — доп. пакеты через --with (пусто у большинства
|
|
42
|
+
# китов; adapterkit — пример кита, которому нужен сосед на прогоне
|
|
43
|
+
# lint-imports, см. apply_template.py --extra-with).
|
|
44
|
+
- uv run --with import-linter lint-imports
|
|
45
|
+
# Гейт 1, часть «согласованность локальных venv» (kitsctl doctor). Скрипт
|
|
46
|
+
# раздаётся шаблоном не всем: в раннере видно ОДИН репозиторий, соседних
|
|
47
|
+
# venv'ов там нет, — поэтому шаг условный и молча пропускается, когда
|
|
48
|
+
# инструмента у кита нет. Настоящее место doctor — локальный прогон перед
|
|
49
|
+
# тегом; см. docs/kits/SAFETY-NET.md, «Известные ограничения».
|
|
50
|
+
- 'if [ -f scripts/kitsctl.py ]; then python3 scripts/kitsctl.py doctor; else echo "kitsctl doctor — инструмента нет в репозитории, пропуск (см. SAFETY-NET.md)"; fi'
|
|
51
|
+
|
|
52
|
+
release-guard:
|
|
53
|
+
extends: .uv
|
|
54
|
+
stage: guard
|
|
55
|
+
needs: [gates]
|
|
56
|
+
rules:
|
|
57
|
+
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
|
|
58
|
+
script:
|
|
59
|
+
- python3 scripts/release_guard.py "$CI_COMMIT_TAG"
|
|
60
|
+
|
|
61
|
+
publish-pypi:
|
|
62
|
+
extends: .uv
|
|
63
|
+
stage: publish
|
|
64
|
+
needs: [release-guard]
|
|
65
|
+
rules:
|
|
66
|
+
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
|
|
67
|
+
id_tokens:
|
|
68
|
+
PYPI_ID_TOKEN:
|
|
69
|
+
aud: pypi
|
|
70
|
+
script:
|
|
71
|
+
- |
|
|
72
|
+
DIST=$(python3 -c "import tomllib;print(tomllib.load(open('pyproject.toml','rb'))['project']['name'])")
|
|
73
|
+
VER="${CI_COMMIT_TAG#v}"
|
|
74
|
+
if python3 - "$DIST" "$VER" <<'PY'
|
|
75
|
+
import json, sys, urllib.request
|
|
76
|
+
dist, ver = sys.argv[1], sys.argv[2]
|
|
77
|
+
try:
|
|
78
|
+
data = json.load(urllib.request.urlopen(f"https://pypi.org/pypi/{dist}/json"))
|
|
79
|
+
except Exception:
|
|
80
|
+
sys.exit(1)
|
|
81
|
+
sys.exit(0 if ver in data.get("releases", {}) else 1)
|
|
82
|
+
PY
|
|
83
|
+
then echo "версия $VER уже на PyPI — публикацию пропускаем"; exit 0; fi
|
|
84
|
+
- uv build
|
|
85
|
+
# Последний рубеж перед необратимым шагом (версии на PyPI неизменяемы,
|
|
86
|
+
# yank — не удаление). Прецедент — leasekit: реальный email и домашний
|
|
87
|
+
# путь разработчика уехали в публичный индекс из тестовых фикстур. Ловит
|
|
88
|
+
# по классам, не по строкам; см. docs/kits/SAFETY-NET.md.
|
|
89
|
+
- python3 scripts/check_dist_leaks.py dist/
|
|
90
|
+
- |
|
|
91
|
+
export UV_PUBLISH_TOKEN=$(python3 - <<'PY'
|
|
92
|
+
import json, os, urllib.request
|
|
93
|
+
req = urllib.request.Request(
|
|
94
|
+
"https://pypi.org/_/oidc/mint-token",
|
|
95
|
+
data=json.dumps({"token": os.environ["PYPI_ID_TOKEN"]}).encode(),
|
|
96
|
+
headers={"Content-Type": "application/json"},
|
|
97
|
+
)
|
|
98
|
+
print(json.load(urllib.request.urlopen(req))["token"])
|
|
99
|
+
PY
|
|
100
|
+
)
|
|
101
|
+
- uv publish
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# СГЕНЕРИРОВАНО из devcontour/tools/kits/template/importlinter.ini — не правь
|
|
2
|
+
# здесь. Правка идёт в шаблон, затем `python tools/kits/apply_template.py <кит>`.
|
|
3
|
+
#
|
|
4
|
+
# Заготовка контракта слоёв. Запуск: `uv run --with import-linter lint-imports`.
|
|
5
|
+
#
|
|
6
|
+
# Контракт ниже — минимум, который годится ЛЮБОМУ киту и не требует ручной
|
|
7
|
+
# настройки: «issuekit не импортирует те киты экосистемы, которых нет в его
|
|
8
|
+
# объявленных зависимостях». Скрытая зависимость — это кит, который работает у
|
|
9
|
+
# автора (сосед стоит в venv) и разваливается у потребителя на первом импорте;
|
|
10
|
+
# именно так ломались pypi-publish и gemini-chat.
|
|
11
|
+
#
|
|
12
|
+
# Список forbidden_modules подставлен установщиком из реестра китов на момент
|
|
13
|
+
# установки: все известные пакеты китов МИНУС собственный МИНУС объявленные в
|
|
14
|
+
# pyproject зависимости. Появилась новая честная зависимость — объяви её в
|
|
15
|
+
# pyproject и переустанови шаблон, а не правь этот файл.
|
|
16
|
+
#
|
|
17
|
+
# Собственные контракты кита (layers/eager_forbidden/declared_dependencies,
|
|
18
|
+
# как у adapterkit) дописываются НИЖЕ отдельными секциями прямо в этом файле.
|
|
19
|
+
# Установщик сверяет файл целиком, поэтому `--check` после такой правки
|
|
20
|
+
# закономерно покажет расхождение с каноном — это ожидаемо и осознанно
|
|
21
|
+
# игнорируется в отчёте ревью, см. docs/kits/SAFETY-NET.md, «Что делать при
|
|
22
|
+
# расхождении» (п.2).
|
|
23
|
+
|
|
24
|
+
[importlinter]
|
|
25
|
+
# include_external_packages нужен: forbidden_modules перечисляет пакеты,
|
|
26
|
+
# внешние относительно root_packages.
|
|
27
|
+
include_external_packages = True
|
|
28
|
+
root_packages =
|
|
29
|
+
issuekit
|
|
30
|
+
exclude_type_checking_imports = True
|
|
31
|
+
|
|
32
|
+
[importlinter:contract:no-undeclared-kits]
|
|
33
|
+
name = issuekit не импортирует киты, которых нет в его зависимостях
|
|
34
|
+
type = forbidden
|
|
35
|
+
source_modules =
|
|
36
|
+
issuekit
|
|
37
|
+
forbidden_modules =
|
|
38
|
+
accountpoolkit
|
|
39
|
+
adapterkit
|
|
40
|
+
agentskit
|
|
41
|
+
aichatkit
|
|
42
|
+
authkit_client
|
|
43
|
+
authkit_contracts
|
|
44
|
+
authkit_server
|
|
45
|
+
b24kit
|
|
46
|
+
browserkit
|
|
47
|
+
chatkit
|
|
48
|
+
clientkit
|
|
49
|
+
corekit
|
|
50
|
+
emojikit
|
|
51
|
+
gitkit
|
|
52
|
+
installerkit
|
|
53
|
+
iokit
|
|
54
|
+
leasekit
|
|
55
|
+
librarykit
|
|
56
|
+
maxkit
|
|
57
|
+
modelkit
|
|
58
|
+
netkit
|
|
59
|
+
ormkit
|
|
60
|
+
persistkit
|
|
61
|
+
servicekit
|
|
62
|
+
sessionkit
|
|
63
|
+
skillkit
|
|
64
|
+
socialkit
|
|
65
|
+
storagekit
|
|
66
|
+
telemetrykit
|
|
67
|
+
totp_client
|
|
68
|
+
worker_service
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Исключения для секрет-скана s-skillgate перед push. Глобы — от корня репо.
|
|
2
|
+
#
|
|
3
|
+
# scripts/check_dist_leaks.py — сам гейт утечки личных данных (сетка
|
|
4
|
+
# безопасности китов, docs/kits/SAFETY-NET.md в devcontour), копия из
|
|
5
|
+
# tools/kits/template/check_dist_leaks.py. Ловит по классам, не по строкам:
|
|
6
|
+
# windows-путь с числовым именем пользователя, личный ящик на публичном
|
|
7
|
+
# провайдере, юникс-домашний путь. Regex-паттерны и пример подсказки
|
|
8
|
+
# (windows-путь с числовым account, «/home/user») по определению совпадают
|
|
9
|
+
# с собственным денилистом — иначе гейт не проверял бы то, ради чего написан (та же
|
|
10
|
+
# ситуация, что и с tests/golden/ у самого check_dist_leaks.py). Файл
|
|
11
|
+
# копируется буквально из канона — правки идут в шаблон, не сюда.
|
|
12
|
+
scripts/check_dist_leaks.py
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
# AGENTS.md — issuekit
|
|
2
|
-
|
|
3
|
-
> Контекст для AI-ассистентов (Claude Code, ChatGPT, Cursor и т.п.), работающих
|
|
4
|
-
> над этим проектом.
|
|
5
|
-
|
|
6
|
-
## Что это
|
|
7
|
-
|
|
8
|
-
(заполнить one-line)
|
|
9
|
-
|
|
10
|
-
## Atlas
|
|
11
|
-
|
|
12
|
-
Проект зарегистрирован в Atlas-БД (Atlas). Карточка:
|
|
13
|
-
|
|
14
|
-
```sh
|
|
15
|
-
atlas projects get issuekit
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Любые изменения метаданных (приоритет, статус, теги) — через atlas CLI:
|
|
19
|
-
|
|
20
|
-
- `atlas projects update issuekit --priority P0` — поменять приоритет
|
|
21
|
-
- `atlas add-tags issuekit -t domain:<slug>` — добавить тег
|
|
22
|
-
- `atlas projects move issuekit --to-type <type>` — конвертировать тип
|
|
23
|
-
|
|
24
|
-
## Тип / Статус (на момент создания)
|
|
25
|
-
|
|
26
|
-
- type=`kit`, status=`experiment`, priority=`P2`
|
|
27
|
-
|
|
28
|
-
## Правила работы
|
|
29
|
-
|
|
30
|
-
- Все исходные тексты, документы, код проекта — в этом репо.
|
|
31
|
-
- Чувствительные данные (`.env`, токены, ключи) — игнорируются `.gitignore`.
|
|
32
|
-
- AI-ассистенту разрешено: читать, генерировать, редактировать в этом репо.
|
|
33
|
-
|
|
34
|
-
## Канонические команды
|
|
35
|
-
|
|
36
|
-
- `atlas projects get issuekit` — карточка проекта
|
|
37
|
-
- `atlas task list --project issuekit` — задачи проекта (когда W7
|
|
38
|
-
волна будет реализована)
|
|
39
|
-
|
|
40
|
-
<!-- atlas:usage:start -->
|
|
41
|
-
## Управление проектом — через Atlas
|
|
42
|
-
|
|
43
|
-
Этот проект ведётся в Atlas (личная PM-система портфеля). Для задач/проектов/эпиков/бэкапов
|
|
44
|
-
используй CLI `atlas` и вызывай навык `atlas` — вся логика и роутинг внутри навыка.
|
|
45
|
-
<!-- atlas:usage:end -->
|
|
1
|
+
# AGENTS.md — issuekit
|
|
2
|
+
|
|
3
|
+
> Контекст для AI-ассистентов (Claude Code, ChatGPT, Cursor и т.п.), работающих
|
|
4
|
+
> над этим проектом.
|
|
5
|
+
|
|
6
|
+
## Что это
|
|
7
|
+
|
|
8
|
+
(заполнить one-line)
|
|
9
|
+
|
|
10
|
+
## Atlas
|
|
11
|
+
|
|
12
|
+
Проект зарегистрирован в Atlas-БД (Atlas). Карточка:
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
atlas projects get issuekit
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Любые изменения метаданных (приоритет, статус, теги) — через atlas CLI:
|
|
19
|
+
|
|
20
|
+
- `atlas projects update issuekit --priority P0` — поменять приоритет
|
|
21
|
+
- `atlas add-tags issuekit -t domain:<slug>` — добавить тег
|
|
22
|
+
- `atlas projects move issuekit --to-type <type>` — конвертировать тип
|
|
23
|
+
|
|
24
|
+
## Тип / Статус (на момент создания)
|
|
25
|
+
|
|
26
|
+
- type=`kit`, status=`experiment`, priority=`P2`
|
|
27
|
+
|
|
28
|
+
## Правила работы
|
|
29
|
+
|
|
30
|
+
- Все исходные тексты, документы, код проекта — в этом репо.
|
|
31
|
+
- Чувствительные данные (`.env`, токены, ключи) — игнорируются `.gitignore`.
|
|
32
|
+
- AI-ассистенту разрешено: читать, генерировать, редактировать в этом репо.
|
|
33
|
+
|
|
34
|
+
## Канонические команды
|
|
35
|
+
|
|
36
|
+
- `atlas projects get issuekit` — карточка проекта
|
|
37
|
+
- `atlas task list --project issuekit` — задачи проекта (когда W7
|
|
38
|
+
волна будет реализована)
|
|
39
|
+
|
|
40
|
+
<!-- atlas:usage:start -->
|
|
41
|
+
## Управление проектом — через Atlas
|
|
42
|
+
|
|
43
|
+
Этот проект ведётся в Atlas (личная PM-система портфеля). Для задач/проектов/эпиков/бэкапов
|
|
44
|
+
используй CLI `atlas` и вызывай навык `atlas` — вся логика и роутинг внутри навыка.
|
|
45
|
+
<!-- atlas:usage:end -->
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.3.0] — 2026-09-08
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- **ЗАМОРОЖЕН.** Atlas #2710 (волна 5): единственный потребитель (`atlas`) убрал
|
|
10
|
+
зависимость `s-issuekit` из своего `pyproject.toml` и получил идентичную
|
|
11
|
+
копию кода как vendored-модуль `atlas._vendor.issuekit`. Код в этом
|
|
12
|
+
репозитории не изменился и не удалён — кит просто перестаёт активно
|
|
13
|
+
развиваться здесь до появления второго независимого потребителя. Версия
|
|
14
|
+
поднята на минор как маркер этой ломающей для «роли кита платформы» правки
|
|
15
|
+
(сам код и публичный API не менялись).
|
|
16
|
+
|
|
17
|
+
## [0.2.0] — 2026-09-08
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- MVP: шаблоны видов жалоб (bug / feature / handoff агент→агент) как данные
|
|
22
|
+
- `lint` — машинная проверка качества жалобы (недостающие поля чеклиста + балл)
|
|
23
|
+
- Навык-гайд «как зарепортить проблему, чтобы вас не возненавидели»
|
|
24
|
+
- `submit` — отправка issue в GitHub/GitLab от `gh`/`glab` с блокирующей проверкой
|
|
25
|
+
- Навык обогащён эталонами индустрии (Tatham/ESR/MRE/SSCCE/handoff)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: s-issuekit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Как правильно составить жалобу (issue/feature/handoff агент→агент): шаблоны-данные + валидатор качества (каких полей чеклиста не хватает) для богатой обратной связи. Тонкий слой на clikit.
|
|
5
5
|
Author: Dmitry
|
|
6
6
|
License: MIT
|
|
@@ -14,6 +14,16 @@ Description-Content-Type: text/markdown
|
|
|
14
14
|
|
|
15
15
|
# issuekit
|
|
16
16
|
|
|
17
|
+
> **⚠️ ЗАМОРОЖЕН (2026-09-08, Atlas #2710, волна 5).** Единственный потребитель —
|
|
18
|
+
> `atlas` — больше не тянет этот пакет с PyPI: код физически перенесён в
|
|
19
|
+
> `atlas._vendor.issuekit` (спека платформы, «по одному потребителю → модуль
|
|
20
|
+
> Atlas»). Этот репозиторий и код в нём **не удалены** и остаются рабочими —
|
|
21
|
+
> кит просто больше не развивается активно здесь. Если появится второй
|
|
22
|
+
> независимый потребитель — код можно расформировать обратно в отдельный кит
|
|
23
|
+
> (обе копии сейчас идентичны на момент заморозки). Новые правки самого
|
|
24
|
+
> `issuekit` (не atlas) ведите осторожно: копия в atlas их не подхватит
|
|
25
|
+
> автоматически.
|
|
26
|
+
|
|
17
27
|
**Как правильно составить жалобу — и валидатор качества.** Переиспользуемый слой
|
|
18
28
|
(dist `s-issuekit` / import `issuekit`) поверх `clikit`. Три вида жалоб как ДАННЫЕ:
|
|
19
29
|
**bug** / **feature** / **handoff** (передача задачи агент→агент). Машинная проверка
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# issuekit
|
|
2
2
|
|
|
3
|
+
> **⚠️ ЗАМОРОЖЕН (2026-09-08, Atlas #2710, волна 5).** Единственный потребитель —
|
|
4
|
+
> `atlas` — больше не тянет этот пакет с PyPI: код физически перенесён в
|
|
5
|
+
> `atlas._vendor.issuekit` (спека платформы, «по одному потребителю → модуль
|
|
6
|
+
> Atlas»). Этот репозиторий и код в нём **не удалены** и остаются рабочими —
|
|
7
|
+
> кит просто больше не развивается активно здесь. Если появится второй
|
|
8
|
+
> независимый потребитель — код можно расформировать обратно в отдельный кит
|
|
9
|
+
> (обе копии сейчас идентичны на момент заморозки). Новые правки самого
|
|
10
|
+
> `issuekit` (не atlas) ведите осторожно: копия в atlas их не подхватит
|
|
11
|
+
> автоматически.
|
|
12
|
+
|
|
3
13
|
**Как правильно составить жалобу — и валидатор качества.** Переиспользуемый слой
|
|
4
14
|
(dist `s-issuekit` / import `issuekit`) поверх `clikit`. Три вида жалоб как ДАННЫЕ:
|
|
5
15
|
**bug** / **feature** / **handoff** (передача задачи агент→агент). Машинная проверка
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# NNNN. Краткий заголовок решения
|
|
2
|
+
|
|
3
|
+
- **Статус:** proposed | accepted | superseded (→ ADR-NNNN) | deprecated
|
|
4
|
+
- **Дата:** ГГГГ-ММ-ДД
|
|
5
|
+
|
|
6
|
+
## Контекст
|
|
7
|
+
|
|
8
|
+
Какую ситуацию/проблему решаем. Что вынуждает принять решение сейчас: ограничения, требования, силы, которые тянут в разные стороны. Достаточно, чтобы понять «почему» без внешнего контекста.
|
|
9
|
+
|
|
10
|
+
## Решение
|
|
11
|
+
|
|
12
|
+
Что именно решили — одной-двумя фразами, в настоящем времени: «Делаем X». Конкретно и проверяемо.
|
|
13
|
+
|
|
14
|
+
## Последствия
|
|
15
|
+
|
|
16
|
+
Что становится проще и что — сложнее/дороже после принятия. Плюсы, минусы, новые обязательства и ограничения, которые теперь придётся держать.
|
|
17
|
+
|
|
18
|
+
## Альтернативы
|
|
19
|
+
|
|
20
|
+
Какие варианты рассматривали и **почему отклонили** (в этом ценность записи). Кратко: вариант → причина отказа / отложено до условия.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# ADR — журнал архитектурных решений
|
|
2
|
+
|
|
3
|
+
**Что это.** ADR (Architecture Decision Record) — короткий документ на **одно** архитектурное решение: контекст → что решили → почему → последствия. Лежат здесь, в `docs/adr/`, со **сквозной нумерацией** (`0001-…`, `0002-…`). Шаблон — [`0000-template.md`](0000-template.md).
|
|
4
|
+
|
|
5
|
+
**Зачем.** «Почему» проекта нельзя держать в комментариях к задачам и переписке — оно теряется. ADR — дистиллят решения: агент читает его **перед** правкой и не «чинит» то, что было выбрано сознательно. Дёшев по токенам: одно решение прочитать проще, чем реконструировать его из истории коммитов.
|
|
6
|
+
|
|
7
|
+
## Когда заводить ADR — когда сошлись 3 условия
|
|
8
|
+
|
|
9
|
+
1. решение **дорого откатить** (влияет на структуру, данные, контракты);
|
|
10
|
+
2. без контекста оно **выглядит странно** (кто-то потом захочет «починить»);
|
|
11
|
+
3. были **реальные альтернативы** и выбор — осознанный трейдофф.
|
|
12
|
+
|
|
13
|
+
Если хотя бы одно условие не выполнено — ADR не нужен, хватит `comment` на задаче в Atlas.
|
|
14
|
+
|
|
15
|
+
## Правила ведения
|
|
16
|
+
|
|
17
|
+
- **Нумерация сквозная**, файл — `NNNN-краткий-слаг.md` (`0001-operating-model-foundamentals.md`).
|
|
18
|
+
- **Не редактировать задним числом.** Принятое решение — исторический факт. Если решение отменено новым — старому ставим `Статус: superseded` (со ссылкой на новое ADR), а не переписываем его.
|
|
19
|
+
- **«Схлопывание».** Когда цепочка `superseded` разрослась, допустимо свести её к одному ADR с текущим состоянием — ради экономии контекста агента. Прежние помечаем как схлопнутые.
|
|
20
|
+
- **Статусы:** `proposed` → `accepted` → (`superseded` / `deprecated`).
|
|
21
|
+
|
|
22
|
+
## Что НЕ идёт в ADR
|
|
23
|
+
|
|
24
|
+
- **состояние** (ветка/worktree, стадия) — это тег/поле задачи в Atlas;
|
|
25
|
+
- **ход работы / handoff** — `comment` на задаче в Atlas;
|
|
26
|
+
- **черновой план реализации** — scratchpad, в `.gitignore`, в репо не коммитится.
|
|
27
|
+
|
|
28
|
+
Полная модель фиксации артефактов (4 слоя) — в `ai-ecosystem-core/AGENT-OPERATING-MODEL.md`, раздел «Модель фиксации артефактов».
|
|
29
|
+
|
|
30
|
+
**Методология:** практика ADR (Michael Nygard), компактный формат Matt Pocock (`github.com/mattpocock/skills`, grill-with-docs), примеры в NATS / AG2.
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
"""
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
from importlib.metadata import version as _version
|
|
12
|
+
|
|
13
|
+
__version__ = _version("s-issuekit") # имя дистрибутива — [project].name в pyproject.toml
|
|
12
14
|
|
|
13
15
|
from .lint import LintResult, lint
|
|
14
16
|
from .render import new_template, section_header
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "s-issuekit"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.0"
|
|
8
8
|
description = "Как правильно составить жалобу (issue/feature/handoff агент→агент): шаблоны-данные + валидатор качества (каких полей чеклиста не хватает) для богатой обратной связи. Тонкий слой на clikit."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|