Загрузка данных


Работаем в project-manager-tools.

Задача:
Сформировать отдельную папку zadanie1 с описанием выполненного задания №1 по интеграции SberTrack в project-manager-tools.

Важно:
- НЕ менять рабочий код проекта.
- НЕ выполнять POST/PATCH/PUT/DELETE.
- НЕ менять .env.
- НЕ выводить секреты.
- НЕ делать git push.
- Нужно только создать документацию/skill-файлы в отдельной папке zadanie1.

Контекст:
В проекте реализована и проверена SberTrack-интеграция как аналог Jira release planner.

Подтверждено на реальных API:

1. Create работает:
- release
- epic
- story
- task
- bug
- blocker

2. Links работают:
- POST /rest/api/unit/v1/link
- type=release
- type=decomposition
- type=containsbug
- link type blocks существует, но автоматическое создание blocks пока не включено, потому что нужно отдельно подтвердить направление source/destination.

3. PATCH/update работает:
- PATCH /rest/api/unit/v2/update/{code}
- HTTP 200
- update_unit_by_code подтверждён.

4. Remote search без cache работает:
- POST /rest/api/unit/v2/find
- через sbertrack_python_api.client.unit.find
- поиск по summary работает.
- cache miss → API search → cache save подтверждено.

5. Ensure pattern работает:
- cache
- verify by code
- remote search by summary
- create only if write_enabled=true
- duplicate protection подтверждена.

6. Blocker подтверждён:
- blocker — отдельный unit type / suit code: blocker
- endpoint: POST /rest/api/unit/v2/blocker/create
- real POST blocker вернул HTTP 200
- обязательные поля: summary, space, attributes
- reason_for_blocking должен быть объектом {"code": "..."}
- workflow_status формат: {"command": "NEW"}
- sber_configuration_item формат: [{"code": "..."}]

Рабочий payload blocker:

{
  "summary": "TEST blocker summary",
  "description": "Optional description",
  "space": "TST123456",
  "attributes": {
    "priority": "low",
    "workflow_status": {
      "command": "NEW"
    },
    "reporter": "23865613",
    "reason_for_blocking": {
      "code": "external_wait"
    },
    "sber_configuration_item": [
      {
        "code": "CI02298102"
      }
    ]
  }
}

Нужно создать структуру:

zadanie1/
  README.md
  SKILL.md
  SBERTRACK_IMPLEMENTATION_REPORT.md
  SBERTRACK_API_KNOWLEDGE.md
  SBERTRACK_YAML_FORMAT.md
  SBERTRACK_TEST_CHECKLIST.md
  examples/
    release-full-example.yaml
    blocker-example.yaml
    commands.md

Содержимое файлов:

## zadanie1/README.md

Должен кратко объяснять:
- что это материалы по заданию №1;
- проект: project-manager-tools;
- цель: добавить поддержку SberTrack вместо/рядом с Jira;
- что реализовано;
- какие ограничения безопасности соблюдены;
- какие файлы читать в каком порядке.

Обязательно добавить раздел:

Что реализовано:
- create release/epic/story/task/bug/blocker;
- links;
- update/PATCH;
- remote search;
- ensure/update/cache;
- dry-run safety;
- YAML planner.

Что осталось:
- подтвердить направление связи blocks для blocker;
- после подтверждения можно добавить автоматическое создание blocker links.

## zadanie1/SKILL.md

Сформировать как skill-инструкцию для GigaCode.

Название:
SberTrack Release Planner Skill

Описание:
Этот skill помогает работать с SberTrack-интеграцией в project-manager-tools: создавать release structure из YAML, выполнять safe dry-run, использовать Jira-like ensure/update/cache, искать сущности по summary, обновлять сущности через PATCH, создавать связи и blocker.

Обязательные правила безопасности:
- по умолчанию sbertrack_write_enabled=false;
- real POST/PATCH/PUT/DELETE только после явного подтверждения пользователя;
- не выводить секреты;
- не выводить полный .env;
- не делать git push без отдельного запроса;
- перед изменением файлов делать backup;
- после real write возвращать sbertrack_write_enabled=false.

Описать основные команды:

1. Проверка синтаксиса:
python -m py_compile src/sbertrack_api.py src/sbertrack_planner.py src/unit_cache.py src/main.py src/yaml_reader.py

2. Cache status:
python src/main.py --tracker sbertrack --action sbertrack_cache_status --project luch --service luch-pprb

3. Safe full release plan:
python src/main.py --tracker sbertrack --action sbertrack_plan_full_release_safe --project luch --service luch-pprb

4. Ensure full release from YAML:
python src/main.py --tracker sbertrack --action sbertrack_create_full_release_from_yaml_ensure --project luch --service luch-pprb

5. Find by summary:
python src/main.py --tracker sbertrack --action sbertrack_find_unit_by_summary --project luch --service luch-pprb --unit-type release --search-summary testic --space TST123456

6. Links only:
python src/main.py --tracker sbertrack --action sbertrack_create_links_only --release_code TST123456-41 --epic_code TST123456-42 --story_codes TST123456-43,TST123456-44 --task_codes TST123456-45,TST123456-46,TST123456-47 --bug_codes TST123456-49

Указать, что команды с write_enabled=false должны быть dry-run/read-only.

## zadanie1/SBERTRACK_IMPLEMENTATION_REPORT.md

Сделать подробный отчёт.

Структура:

# SberTrack implementation report

## 1. Цель
Добавить поддержку SberTrack в project-manager-tools как Jira-like release planner.

## 2. Что было реализовано

Таблица:
Функция | Статус | Endpoint | Комментарий

Заполнить:

release create | подтверждено | POST /rest/api/unit/v2/release/create | HTTP 200
epic create | подтверждено | POST /rest/api/unit/v2/epic/create | HTTP 200
story create | подтверждено | POST /rest/api/unit/v2/story/create | HTTP 200
task create | подтверждено | POST /rest/api/unit/v2/task/create | HTTP 200
bug create | подтверждено | POST /rest/api/unit/v2/bug/create | HTTP 200
blocker create | подтверждено | POST /rest/api/unit/v2/blocker/create | HTTP 200
links create | подтверждено | POST /rest/api/unit/v1/link | HTTP 201, HTTP 570 если связь уже существует
update | подтверждено | PATCH /rest/api/unit/v2/update/{code} | HTTP 200
remote search | подтверждено | POST /rest/api/unit/v2/find | HTTP 200

## 3. Jira-like ensure/update/cache

Описать алгоритм:

ensure_unit_by_summary():

1. Check cache.
2. If cache hit:
   - get_unit_by_code(code)
   - if exists: update_unit_by_code(code, payload) or return code
   - if stale: remove cache and continue.
3. If cache miss:
   - remote search by summary.
4. If found:
   - save to cache;
   - update if needed;
   - return code.
5. If not found:
   - create only when sbertrack_write_enabled=true.
6. If write_enabled=false:
   - only dry-run.

## 4. Safety

Описать:
- sbertrack_write_enabled=false by default;
- no secrets in output;
- sanitized payload;
- no git push;
- backups before changes;
- write flag returned to false after tests.

## 5. Подтверждённые реальные тесты

Указать:
- API доступен;
- current-info HTTP 200;
- space TST123456 HTTP 200;
- release/epic/story/task/bug/blocker создавались в тестовом пространстве;
- PATCH проверен;
- remote search проверен;
- links проверены.

## 6. Что осталось

Добавить:
- автоматическая связь blocker через link type blocks пока не включена;
- нужно уточнить направление source/destination:
  - blocker -> blocked unit
  - или blocked unit -> blocker.

## zadanie1/SBERTRACK_API_KNOWLEDGE.md

Описать всё, что известно по API.

Разделы:

# SberTrack API knowledge

## 1. Python API

Библиотека:
sber-devops-zis-sbertrack-python-api

Импорт:
from sbertrack_python_api import SbertrackClient

Клиент:
SbertrackClient

HTTP методы:
client.get(path, **kwargs)
client.post(path, json_data=data)
client.put(path, json_data=data)
client.patch(path, json_data=data)
client.delete(path, **kwargs)

## 2. Unit create endpoints

Таблица:
Unit type | Endpoint

release | /rest/api/unit/v2/release/create
epic | /rest/api/unit/v2/epic/create
story | /rest/api/unit/v2/story/create
task | /rest/api/unit/v2/task/create
bug | /rest/api/unit/v2/bug/create
blocker | /rest/api/unit/v2/blocker/create

## 3. Read/update/search endpoints

get by code:
GET /rest/api/unit/v2/{unit_code}

update:
PATCH /rest/api/unit/v2/update/{code}

search:
POST /rest/api/unit/v2/find

links:
POST /rest/api/unit/v1/link

link types:
POST /rest/api/unit/v2/link/types

## 4. Blocker

Подтверждено:
- blocker отдельный suit/unit type;
- GET /rest/api/suit/v1/blocker возвращает HTTP 200;
- POST /rest/api/unit/v2/blocker/create работает;
- blocker_plugin health-check существует;
- reason_for_blocking mandatory;
- reason_for_blocking format: {"code": "..."}.

## 5. Link types

Добавить:
- release;
- decomposition;
- containsbug;
- blocks;
- dependend;
- workplan;
- plain_connection.

Обязательно указать:
blocks существует, но направление связи нужно подтвердить отдельно.

## zadanie1/SBERTRACK_YAML_FORMAT.md

Описать YAML формат.

Добавить полный пример:

release:
  summary: "final-check-20260710-003"
  description: "Final release check from project-manager-tools"
  space: "TST123456"
  ci_code: "CI02298102"
  priority: "low"
  workflow_status:
    command: "NEW"
  release_kind: "planned"
  uat_ground: "hotfix"
  conditions_itservice: "dontChange"
  without_integration: false
  omni: false
  uat_start_date: "2026-06-10T00:00:00+03:00"
  introduction_start_date: "2026-06-16T09:00:00+03:00"

epic:
  summary: "final-check-20260710-003 epic"
  description: "Epic for final check"
  team: "Команда"

stories:
  - summary: "final-check-20260710-003 story 1"
    description: "Story 1 for final check"
  - summary: "final-check-20260710-003 story 2"
    description: "Story 2 for final check"

tasks:
  - summary: "final-check-20260710-003 task 1"
    description: "Task 1 for final check"
  - summary: "final-check-20260710-003 task 2"
    description: "Task 2 for final check"
  - summary: "final-check-20260710-003 task 3"
    description: "Task 3 for final check"

bugs:
  - summary: "final-check-20260710-003 bug 1"
    description: "Bug 1 for final check"
    ci_code: "CI02298102"

blockers:
  - summary: "final-check-20260710-003 blocker 1"
    description: "Blocker 1 for final check"
    reason_for_blocking: "external_wait"
    priority: "low"
    reporter: "23865613"
    ci_code: "CI02298102"

Пояснить:
- root release.ci_code должен прокидываться в дочерние сущности, если у них нет своего ci_code;
- blocker reason_for_blocking в YAML может быть строкой, но в API уходит объектом;
- links для release/epic/story/task/bug создаются автоматически;
- blocks links для blocker пока не создаются автоматически.

## zadanie1/SBERTRACK_TEST_CHECKLIST.md

Сделать checklist.

Разделы:

# SberTrack test checklist

## 1. Before test

- Проверить текущую директорию.
- Проверить .env без вывода секретов:
  grep -E 'sbertrack_write_enabled|sbertrack_project_key|sbertrack_base_url' .env
- Убедиться, что sbertrack_write_enabled=false.
- Проверить py_compile.

## 2. Dry-run tests

Команды:
python src/main.py --tracker sbertrack --action sbertrack_cache_status --project luch --service luch-pprb

python src/main.py --tracker sbertrack --action sbertrack_plan_full_release_safe --project luch --service luch-pprb

python src/main.py --tracker sbertrack --action sbertrack_create_full_release_from_yaml_ensure --project luch --service luch-pprb

Ожидается:
- POST не выполняется;
- payload отображается sanitized;
- blockers отображаются;
- links не создаются при write_enabled=false.

## 3. Real write tests

Написать:
Выполнять только после явного подтверждения наставника/пользователя.

Проверять:
- create release;
- create epic;
- create story;
- create task;
- create bug;
- create blocker;
- create links;
- PATCH update;
- remote search;
- ensure without duplicate.

## 4. After write

- Вернуть sbertrack_write_enabled=false.
- Проверить cache.
- Не делать git push без отдельного запроса.

## zadanie1/examples/release-full-example.yaml

Создать полный YAML из раздела SBERTRACK_YAML_FORMAT.md.

## zadanie1/examples/blocker-example.yaml

Создать только пример blocker:

blockers:
  - summary: "TEST blocker summary"
    description: "Optional description"
    space: "TST123456"
    priority: "low"
    workflow_status:
      command: "NEW"
    reporter: "23865613"
    reason_for_blocking: "external_wait"
    ci_code: "CI02298102"

И рядом добавить комментарий в markdown или YAML comment:
reason_for_blocking уходит в API как {"code": "external_wait"}.

## zadanie1/examples/commands.md

Добавить команды:

# Commands

## Syntax check

python -m py_compile src/sbertrack_api.py src/sbertrack_planner.py src/unit_cache.py src/main.py src/yaml_reader.py

## Safe plan

python src/main.py --tracker sbertrack --action sbertrack_plan_full_release_safe --project luch --service luch-pprb

## Ensure dry-run

python src/main.py --tracker sbertrack --action sbertrack_create_full_release_from_yaml_ensure --project luch --service luch-pprb

## Cache status

python src/main.py --tracker sbertrack --action sbertrack_cache_status --project luch --service luch-pprb

## Find release by summary

python src/main.py --tracker sbertrack --action sbertrack_find_unit_by_summary --project luch --service luch-pprb --unit-type release --search-summary final-check-20260710-003 --space TST123456

## Links only example

python src/main.py --tracker sbertrack --action sbertrack_create_links_only --release_code TST123456-82 --epic_code TST123456-83 --story_codes TST123456-85,TST123456-86 --task_codes TST123456-87,TST123456-88,TST123456-89 --bug_codes TST123456-81

## Правила безопасности

Перед real write:
- явно подтвердить действие;
- включить sbertrack_write_enabled=true;
- выполнить только один тест;
- сразу вернуть sbertrack_write_enabled=false.

Финально:
После создания файлов вывести отчет:

1. Какие файлы созданы.
2. Кратко что внутри каждого файла.
3. Подтвердить:
- рабочий код проекта не менялся;
- POST/PATCH/PUT/DELETE не выполнялись;
- .env не менялся;
- секреты не выводились;
- git push не выполнялся.