gennady 0.5.1-next.4 → 0.6.0

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.
Files changed (70) hide show
  1. package/README.md +140 -107
  2. package/dist/.ai/agents/agent-review-verifier.xml +35 -13
  3. package/dist/assistant/music/music-filter.d.ts +7 -0
  4. package/dist/chunks/help.cmd-CWasx25o.js +24 -0
  5. package/dist/chunks/{index-BQ06E6S4.js → index-5xIgwwKx.js} +2 -2
  6. package/dist/chunks/{index-CUY8EsN_.js → index-B4m0-PAT.js} +7 -7
  7. package/dist/chunks/{index-83Uuqvoa.js → index-B5bA2T7A.js} +12 -13
  8. package/dist/chunks/{index-DKaDIbyw.js → index-B63fYXL2.js} +1 -1
  9. package/dist/chunks/{index-DNvWeAkM.js → index-C0andxna.js} +1 -1
  10. package/dist/chunks/{index-Bp_KTwxR.js → index-CNbmXK8M.js} +2 -1
  11. package/dist/chunks/index-Dqe1TdW4.js +265 -0
  12. package/dist/chunks/{ai-legacy-core-DXYSGwDl.js → index-iqg0w_pE.js} +38 -25
  13. package/dist/chunks/run-review-command.logic-a_M3CkeZ.js +267 -0
  14. package/dist/chunks/services-Sb7TwLxt.js +122 -0
  15. package/dist/chunks/shared-BgLzFWMH.js +577 -0
  16. package/dist/cli/cmd/_shared/prompt/io/load-agent-template.io.d.ts +7 -0
  17. package/dist/cli/cmd/_shared/prompt/logic/build-ai-first-knowledge-block.logic.d.ts +7 -0
  18. package/dist/cli/cmd/_shared/prompt/logic/build-ai-verify-placeholders.logic.d.ts +16 -0
  19. package/dist/cli/cmd/_shared/prompt/logic/verify-commands/resolve-verify-commands.logic.d.ts +1 -0
  20. package/dist/cli/cmd/help/help.cmd.d.ts +1 -0
  21. package/dist/cli/cmd/resolve-conflicts/_core/io/resolve-conflicts-template-load.io.d.ts +6 -0
  22. package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-command-args-parse.logic.d.ts +8 -0
  23. package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-command-run.logic.d.ts +9 -0
  24. package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-context-git-build.logic.d.ts +10 -0
  25. package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-artifact.type.d.ts +9 -0
  26. package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-command-args.type.d.ts +8 -0
  27. package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-command-result.type.d.ts +11 -0
  28. package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-context-git.type.d.ts +29 -0
  29. package/dist/cli/cmd/resolve-conflicts/_core/xml/resolve-conflicts-artifact-build.xml.d.ts +16 -0
  30. package/dist/cli/cmd/resolve-conflicts/_core/xml/resolve-conflicts-render.xml.d.ts +8 -0
  31. package/dist/cli/cmd/resolve-conflicts/index.d.ts +1 -0
  32. package/dist/cli/cmd/review/_core/logic/build-ai-first-knowledge-block.logic.d.ts +1 -0
  33. package/dist/cli/cmd/review/_core/logic/build-ai-verify-placeholders.logic.d.ts +2 -0
  34. package/dist/cli/cmd/review/_core/logic/verify-commands/resolve-verify-commands.logic.d.ts +1 -0
  35. package/dist/cli/cmd/review/_core/types/review-command-args.type.d.ts +1 -0
  36. package/dist/cli/cmd/review/_core/types/review-context-mr.type.d.ts +10 -0
  37. package/dist/cli/cmd/review/_core/xml/build-review-artifact.xml.d.ts +4 -2
  38. package/dist/cli/cmd/review/_core/xml/render-review-verify.xml.d.ts +3 -2
  39. package/dist/cli/utils/ai-legacy/ai-legacy-core.d.ts +1 -1
  40. package/dist/gennady.js +15 -13
  41. package/dist/index.js +2 -2
  42. package/dist/services/ai-client/ai-client.d.ts +1 -0
  43. package/dist/services/ai-client/providers/ai-model.type.d.ts +33 -0
  44. package/dist/services/ai-client/providers/open-router/open-router-model.type.d.ts +29 -0
  45. package/dist/services/ai-client/providers/open-router/open-router-provider.d.ts +9 -0
  46. package/dist/services/ai-client/providers/openai-like-provider.d.ts +2 -0
  47. package/dist/services/data-ore/telegram/telegram-data-ore.d.ts +11 -0
  48. package/dist/services/data-ore/telegram/telegram-data-ore.types.d.ts +5 -0
  49. package/dist/services/data-ore/telegram/telegram-demo-music-helper.d.ts +9 -0
  50. package/dist/services/data-ore/telegram/telegram-demo.d.ts +2 -0
  51. package/dist/services/dbc/parser/dbc-parser.types.d.ts +65 -0
  52. package/dist/services/dbc/parser/implementations/jsdoc/dbc-jsdoc-parser.d.ts +79 -0
  53. package/dist/services/logger/logger.d.ts +16 -0
  54. package/dist/services/vcs-client/{gitlab/vcs-merge-discussions.d.ts → abstract/vcs-client-merge-discussions.d.ts} +9 -13
  55. package/dist/services/vcs-client/{gitlab/vcs-merge-requests.d.ts → abstract/vcs-client-merge-requests.d.ts} +12 -18
  56. package/dist/services/vcs-client/abstract/vcs-client.d.ts +13 -0
  57. package/dist/services/vcs-client/entities/vcs-user.type.d.ts +4 -0
  58. package/dist/services/vcs-client/gitlab/vcs-gitlab-client.d.ts +8 -5
  59. package/dist/services/vcs-client/gitlab/vcs-gitlab-merge-discussions.d.ts +30 -0
  60. package/dist/services/vcs-client/gitlab/vcs-gitlab-merge-requests.d.ts +27 -0
  61. package/dist/shared/backend/git/git-core.d.ts +3 -2
  62. package/dist/shared/common/logger.d.ts +4 -5
  63. package/package.json +17 -4
  64. package/dist/chunks/index-CCWTL4XZ.js +0 -14
  65. package/dist/chunks/index-Cmblo_rP.js +0 -14
  66. package/dist/chunks/run-review-command.logic-C91rux6y.js +0 -273
  67. package/dist/chunks/services-Di_JJ8fB.js +0 -123
  68. package/dist/chunks/shared-CDEy6MHj.js +0 -418
  69. package/dist/cli/cmd/agent/index.d.ts +0 -1
  70. /package/dist/cli/cmd/{agent/agent.cmd.d.ts → resolve-conflicts/resolve-conflicts.cmd.d.ts} +0 -0
package/README.md CHANGED
@@ -2,176 +2,209 @@
2
2
 
3
3
  **GEN**eral **E**xtensible **N**eural **N**etwork **A**daptive **D**ata **Y**ntelligence.
4
4
 
5
- ```bash
6
- # Generate commit message
7
- npx gennady
5
+ CLI-инструмент для работы с git-изменениями, merge-конфликтами и GitLab review-пайплайном.
8
6
 
9
- # Code review for staged changes
10
- npx gennady review
7
+ ---
11
8
 
12
- # Display file contents
13
- npx gennady cat <path1> <path2> ...
14
- ```
9
+ ## Быстрый старт
15
10
 
16
- ---
11
+ ```bash
12
+ # Справка
13
+ npx gennady help
17
14
 
18
- ### Features
15
+ # По умолчанию показывается справка
16
+ npx gennady
19
17
 
20
- - 🤖 [**Commit Message**](#-commit-messages): Generate clear, descriptive git commit messages from staged changes
21
- - 📝 [**Code Review**](#-code-review): Review staged changes for critical issues (logic, runtime, security)
22
- - 🐱 [**cat**](#-cat): Display file contents with markdown/XML formatting
18
+ # Commit запускается только явно
19
+ npx gennady commit
20
+ ```
23
21
 
24
22
  ---
25
23
 
26
- ## 🔖 Usage Overview
24
+ ## 🧩 Что нужно в окружении
25
+
26
+ - Node.js `22+`
27
+ - Git-репозиторий (для команд с git-контекстом)
28
+ - Для GitLab-команд: `GITLAB_PERSONAL_TOKEN`
27
29
 
28
- Gennady provides three main CLI commands:
30
+ ```bash
31
+ # Обязательно для review-verify / review-issues / vcs-reply (live)
32
+ export GITLAB_PERSONAL_TOKEN="<token>"
29
33
 
30
- - `npx gennady` — Generate commit messages from staged git changes
31
- - `npx gennady review` — Review staged changes for critical issues
32
- - `npx gennady cat <path1> <path2> ...` — Display file contents
34
+ # Опционально (default: /api/v4)
35
+ export GITLAB_API_PATH="/api/v4"
36
+ ```
33
37
 
34
38
  ---
35
39
 
36
- ## 🤖 Commit Messages
37
-
38
- ```sh
39
- # Basic usage
40
- npx gennady
40
+ ## 🧭 Команды CLI
41
41
 
42
- # Generate oneline commit message
43
- npx gennady --mode=oneline
42
+ ### 📝 `commit`
44
43
 
45
- # Generate detailed commit message
46
- npx gennady --mode=detailed
44
+ Генерация commit message из staged-изменений.
47
45
 
48
- # Generate detailed commit message relative to the target branch
49
- npx gennady --branch=develop
46
+ ```bash
47
+ npx gennady commit
48
+ npx gennady commit --mode=oneline
49
+ npx gennady commit --branch=develop
50
+ npx gennady commit --task=MAILCORE-123
51
+ npx gennady commit --apply
50
52
  ```
51
53
 
52
- ### Options
53
-
54
- | Option | Alias(es) | Description |
55
- | ----------- | --------------- | ----------------------------------------------------- |
56
- | `--mode` | `-m` | Set the mode (`auto`, `oneline`, `detailed`) |
57
- | `--oneline` | `--short`, `-o` | Generate a one-line commit message |
58
- | `--model` | | Specify the AI model |
59
- | `--branch` | `-b` | Target branch for diff |
60
- | `--apply` | | Immediately apply the generated commit message to git |
61
-
62
- #### What Happens?
54
+ **Опции:**
63
55
 
64
- - Gennady analyzes your staged changes.
65
- - It generates a commit message.
66
- - If your system language isn't English, it translates the message for you.
56
+ - `--mode`, `-m`: `auto | oneline | detailed`
57
+ - `--oneline`, `--short`, `--one`, `-o`: форсировать one-line
58
+ - `--branch`, `-b`: target branch для diff
59
+ - `--task`, `-t`: добавить task id в subject
60
+ - `--model`: модель AI backend
61
+ - `--api`, `--apiUrl`: URL AI API
62
+ - `--apply`: сразу выполнить `git commit` с сгенерированным текстом
67
63
 
68
64
  ---
69
65
 
70
- ## 📝 Code Review
66
+ ### 🔍 `review`
71
67
 
72
- Review staged changes for critical issues.
68
+ Проверка staged-изменений на критичные проблемы.
73
69
 
74
- ```sh
70
+ ```bash
75
71
  npx gennady review
76
-
77
- # Review relative to a specific branch
78
72
  npx gennady review --branch=develop
79
73
  ```
80
74
 
81
- #### Options
75
+ **Опции:**
76
+
77
+ - `--branch`, `-b`: ветка для сравнения
82
78
 
83
- | Option | Alias(es) | Description |
84
- | ---------- | --------- | ---------------------- |
85
- | `--branch` | `-b` | Target branch for diff |
79
+ ---
80
+
81
+ ### 🐱 `cat`
82
+
83
+ Вывод файлов в `XML` или `Markdown`.
84
+
85
+ ```bash
86
+ npx gennady cat ./src
87
+ npx gennady cat "./src/**/*.ts" --output=md
88
+ npx gennady cat ./src --plain
89
+ ```
86
90
 
87
- #### What Happens?
91
+ **Опции:**
88
92
 
89
- - Analyzes staged changes
90
- - Checks for critical issues in added/modified lines (logic, runtime, security)
91
- - Outputs `GOOD` if no issues found, or structured issue list
93
+ - `--output`, `-o`: `xml` (по умолчанию) или `md`
94
+ - `--plain`: без ANSI-цветов
95
+ - `--exclude`, `-e`: исключить паттерны
96
+ - `--ext`: фильтр по расширениям
92
97
 
93
98
  ---
94
99
 
95
- ## 🐱 cat
100
+ ### `review-verify`
96
101
 
97
- Display file contents with optional markdown or XML formatting.
102
+ Собирает prompt для верификации discussion-тредов Merge Request (GitLab).
98
103
 
99
- ```sh
100
- npx gennady cat ./src/
104
+ ```bash
105
+ # Автоопределение MR по текущей ветке
106
+ npx gennady review-verify
101
107
 
102
- # Output as markdown
103
- npx gennady cat ./src/ --output=md
108
+ # По URL
109
+ npx gennady review-verify "https://gitlab.example.com/group/project/-/merge_requests/123"
110
+ npx gennady review-verify --url="https://gitlab.example.com/group/project/-/merge_requests/123"
104
111
 
105
- # Output as XML
106
- npx gennady cat ./src/ --output=xml
112
+ # По ref
113
+ npx gennady review-verify group/project!123
114
+ npx gennady review-verify --ref=group/project!123
107
115
 
108
- # Copy without color codes
109
- npx gennady cat ./src/ --plain | pbcopy
116
+ # Явно project + iid
117
+ npx gennady review-verify --project=group/project --iid=123
110
118
  ```
111
119
 
112
- #### Options
120
+ **Опции:**
121
+
122
+ - `--branch`, `-b`: branch-режим
123
+ - `--url`: URL merge request
124
+ - `--ref`: `<project>!<iid>`
125
+ - `--project`: путь GitLab-проекта
126
+ - `--iid`: IID merge request
127
+ - `--all`: включать resolved discussions
113
128
 
114
- | Option | Alias(es) | Description |
115
- | ----------- | --------- | -------------------------- |
116
- | `--output` | `-o` | Format: `md` or `xml` |
117
- | `--plain` | | Output without colors |
118
- | `--exclude` | `-e` | Patterns to exclude |
119
- | `--ext` | | File extensions to include |
129
+ Примечание: поддерживается GitLab-host (`*gitlab*` в host).
120
130
 
121
131
  ---
122
132
 
123
- ## Setup LLM
133
+ ### 📄 `review-issues`
124
134
 
125
- ### Local
135
+ Как `review-verify`, но возвращает только XML-артефакт issues.
126
136
 
127
- ```sh
128
- brew install ollama
129
- ollama pull llama3:8b
130
- ollama serve
137
+ ```bash
138
+ npx gennady review-issues
139
+ npx gennady review-issues --ref=group/project!123
131
140
  ```
132
141
 
142
+ **Опции:** те же, что у `review-verify`.
143
+
133
144
  ---
134
145
 
135
- ### External
146
+ ### 🧠 `resolve-conflicts`
136
147
 
137
- Create `~/.gennadyrc` configuration file:
148
+ Собирает prompt для AI-разрешения merge-конфликтов с ветвлением по confidence (auto-resolve или диалог с оператором).
138
149
 
139
- ```json
140
- {
141
- "models": [
142
- {
143
- "model": "gpt-3.5-turbo-0125",
144
- "url": "https://api.openai.com/v1/chat/completions",
145
- "key": "..."
146
- },
147
- {
148
- "model": "llama3:8b",
149
- "url": "http://127.0.0.1:11434/api/generate"
150
- }
151
- ]
152
- }
150
+ ```bash
151
+ # Нужно активное merge-состояние и конфликтующие файлы
152
+ npx gennady resolve-conflicts
153
+
154
+ # Опциональные override-метки веток
155
+ npx gennady resolve-conflicts --branch=main --incoming=feature/refactor-x
153
156
  ```
154
157
 
155
- ---
158
+ **Опции:**
159
+
160
+ - `--branch`, `-b`: override для current branch label
161
+ - `--incoming`: override для incoming branch label
162
+
163
+ Важно: команда **не делает** `git commit`, она печатает prompt.
156
164
 
157
- ## 🔌 API
165
+ ---
158
166
 
159
- Gennady provides a JavaScript/TypeScript API for programmatic use.
167
+ ### 💬 `vcs-reply`
160
168
 
161
- ### Installation
169
+ Постинг ответов в GitLab MR discussions из JSON-массива через `stdin`.
162
170
 
163
171
  ```bash
164
- npm install gennady
172
+ echo '[{"discussionId":"123","body":"✅ Fixed"}]' | \
173
+ npx gennady vcs-reply --project=group/project --iid=123
174
+
175
+ # Проверка без отправки
176
+
177
+ echo '[{"discussionId":"123","body":"✅ Fixed"}]' | \
178
+ npx gennady vcs-reply --project=group/project --iid=123 --dry-run
165
179
  ```
166
180
 
167
- ### Exports
181
+ **Опции:**
168
182
 
169
- - `AiModel`: Core AI model interface
170
- - `GennadyRc`: Configuration management
171
- - `unguard`: Error handling utilities
183
+ - `--project`: путь GitLab-проекта
184
+ - `--iid`: IID merge request
185
+ - `--dry-run`, `--dry`: не отправлять, только показать dry-run вывод
172
186
 
173
- See source code for detailed JSDoc documentation.
187
+ **Формат stdin:**
174
188
 
175
- ## 🎉 Happy Coding with Gennady!
189
+ ```json
190
+ [{ "discussionId": "<discussion-id>", "body": "<reply markdown>" }]
191
+ ```
192
+
193
+ ---
194
+
195
+ ## 🛠️ Типовые сценарии
196
+
197
+ ### 1. Верификация MR
176
198
 
177
- > Made with 🤖 by Konstantin Lebedev
199
+ ```bash
200
+ export GITLAB_PERSONAL_TOKEN="<token>"
201
+ npx gennady review-verify --ref=group/project!123
202
+ ```
203
+
204
+ ### 2. Разрешение merge-конфликтов
205
+
206
+ ```bash
207
+ git merge feature/some-branch
208
+ # если есть конфликты
209
+ npx gennady resolve-conflicts
210
+ ```
@@ -20,8 +20,9 @@
20
20
  <Axiom id="AX_TRUST_VERIFY">**Trust, but Verify.** Ревьюер дает гипотезу. Код дает факты. Верь только коду.</Axiom>
21
21
  <Axiom id="AX_CONTEXT_KING">**Context is King.** Ошибка в вакууме может быть фичей в контексте бизнес-логики.</Axiom>
22
22
  <Axiom id="AX_EVIDENCE">**Evidence over Opinion.** Любое решение требует ссылки на доку, стандарт или код.</Axiom>
23
- <Axiom id="AX_PRAGMATIC_TDD">**Pragmatic TDD.** Есть тесты? Сначала Red, потом Green. Нет тестов? Не городи огород, используй `npm run check`.</Axiom>
23
+ <Axiom id="AX_PRAGMATIC_TDD">**Pragmatic TDD.** Есть тесты? Сначала Red, потом Green. Нет тестов? Не городи огород, используй <!--ai:verify-axiom-hint-->.</Axiom>
24
24
  <Axiom id="AX_CLARITY">**Clarity is Product.** Твой продукт — это понятный план, который я могу утвердить или отвергнуть.</Axiom>
25
+ <Axiom id="AX_OPERATOR_LANGUAGE">Все сообщения оператору (план, вопросы, отчёты, ответы) формулируй на русском языке. Английский допустим только для кода, команд, идентификаторов и терминов.</Axiom>
25
26
  </Belief_State>
26
27
  <Tool_Usage_Policy>
27
28
  <Tool_Agnosticism>
@@ -35,7 +36,7 @@
35
36
  <Secondary_Tools>
36
37
  **Terminal / Bash.** Используй терминал (`ls`, `grep`, `find`, `cat`) в двух случаях:
37
38
  1. Нативные инструменты не дали результата или недоступны.
38
- 2. Нужно выполнить специфическую команду (`npm run test`, `git commit`, `npx gennady`).
39
+ 2. Нужно выполнить специфическую команду (<!--ai:verify-tools-example-->).
39
40
  </Secondary_Tools>
40
41
  <Verification_Tools>
41
42
  **Web Search.** Используй для проверки документации, если внутренней базы знаний недостаточно.
@@ -50,6 +51,7 @@
50
51
  <Step id="STEP_1_INGESTION">
51
52
  <Goal>Загрузить контекст задачи.</Goal>
52
53
  <Action>
54
+ <!--ai:first-->
53
55
  Проанализируй `<MR_Audit_Context>` в разделе данных.
54
56
  Сфокусируйся на тегах `<Review_Threads>` и вложенных `<Thread>`.
55
57
  Для каждого `<Thread>` зафиксируй:
@@ -68,13 +70,14 @@
68
70
  </Action>
69
71
  </Step>
70
72
  <Step id="STEP_3_PLANNING_AND_NEGOTIATION">
73
+ <Precondition>STEP_2_DEEP_DIVE_INVESTIGATION завершён, по каждому `<Thread>` собраны проверяемые факты.</Precondition>
71
74
  <Goal>Согласовать действия с пользователем.</Goal>
72
75
  <Action>
73
76
  Сформируй **План Верификации** в формате Markdown.
74
77
 
75
78
  **ФОРМАТ ОТЧЕТА (Строго соблюдай):**
76
79
 
77
- # 📝 План Верификации для [MR_ID]
80
+ # 📝 План Верификации для `<MR_PROJECT_PATH>!<MR_IID>` (ver_<num>)
78
81
 
79
82
  ## ⭕ Отклонённые замечания (No Action Required)
80
83
  ### ⭕ **[SHORT_ID]**: Краткое название
@@ -96,36 +99,53 @@
96
99
 
97
100
  ---
98
101
 
99
- **СТОП-ФАКТОР:**
100
- Выведи этот план и **ОСТАНОВИСЬ**.
101
- Напиши: "Жду вашего решения. Вы можете написать 'ОК' для старта или указать ID для изменения статуса (например: '[SHORT_ID] - отклонить, это не баг')."
102
+ **СТОП после плана (обязательно):**
103
+ 1. Выведи отчёт целиком и **остановись** — не переходи к коду и не к черновикам ответов без явного выбора пользователя.
104
+ 2. Определи, какой **Case** в следующем блоке Switch соответствует твоему отчёту (ровно один). В конце отчёта перечисли **только** варианты из этого Case — простыми формулировками, без лишних синонимов команд.
105
+
106
+ <Switch exclusive="true" purpose="Ветвление ответа пользователя после Плана Верификации">
107
+ <Case when="В секции «План исправлений» есть хотя бы один пункт">
108
+ - **Согласен, делай по плану** → `OK` / `Confirm` / `Run` или явная фраза «выполняй план». Переход: STEP_4.
109
+ - **Поправить план** → пользователь указывает `[SHORT_ID]` и желаемое изменение (например: не баг — убрать из исправлений; наоборот баг — перенести в исправления; уточнить шаги). Пересобери план и снова остановись на STEP_3.
110
+ </Case>
111
+ <Case when="Исправлений нет: все замечания в «Отклонённые» и секция «План исправлений» пуста">
112
+ - **Оспорить NOFIX** → `[SHORT_ID]`: всё-таки баг или улучшение, взять в работу. Обнови классификацию; при появлении исправлений — новый план и снова STOP на STEP_3.
113
+ - **Отвечать без кода** → явный запрос на черновики ответов (например: «к ответам», «формируй ответы», `Draft`). Зафиксируй: коммита не будет. Переход: STEP_6, **минуя** STEP_4–5.
114
+ </Case>
115
+ </Switch>
116
+
117
+ В конце сообщения пользователю — **короткий нумерованный список** «что написать дальше»; пункты только из выбранного Case.
102
118
  </Action>
103
119
  </Step>
104
120
  <Step id="STEP_4_CODING_AND_VERIFICATION">
121
+ <Precondition>STEP_3_PLANNING_AND_NEGOTIATION завершён, пользователь согласовал выполнение плана (`OK` / `Confirm` / `Run` или эквивалент), и в плане есть пункты к исправлению.</Precondition>
105
122
  <Trigger>Получено согласие пользователя на План.</Trigger>
106
123
  <Goal>Внести изменения и проверить их, но НЕ фиксировать.</Goal>
107
124
  <Action>
108
125
  1. **Edit:** Используй нативные инструменты (`edit_file`) для внесения изменений согласно плану.
109
- 2. **Verify:** Запусти локальные проверки (`npm run test`, `npm run lint`, `npm run check`).
126
+ 2. **Verify:** <!--ai:verify-step-commands-->
110
127
  3. **Report:** Сообщи пользователю: "Изменения внесены. Результаты тестов: [PASS/FAIL]".
111
128
  4. **Propose Commit:** Предложи текст коммита (Conventional Commits), например: `fix(logger): mask sensitive data in logs`.
112
129
  5. **STOP:** Жди команды на коммит.
113
130
  </Action>
114
131
  </Step>
115
132
  <Step id="STEP_5_COMMIT_NEGOTIATION">
133
+ <Precondition>STEP_4_CODING_AND_VERIFICATION завершён, изменения и результаты верификации представлены пользователю.</Precondition>
116
134
  <Trigger>Пользователь проверил код и одобрил текст коммита.</Trigger>
117
135
  <Goal>Зафиксировать изменения в git и отправить их в удаленный репозиторий.</Goal>
118
136
  <Action>
119
137
  1. Если пользователь попросил правки — вернись на шаг назад.
120
- 2. Если пользователь сказал "Коммить" — выполни `git commit -m "..."` через терминал.
138
+ 2. Если пользователь сказал "Commit" — выполни `git commit -m "..."` через терминал.
121
139
  3. Сразу после успешного коммита выполни `git push origin HEAD` через терминал.
122
140
  4. Сообщи: "Коммит создан и отправлен в удаленный репозиторий. Перехожу к подготовке ответов."
123
141
  </Action>
124
142
  </Step>
125
143
  <Step id="STEP_6_RESPONSE_DRAFTING">
144
+ <Precondition>STEP_5_COMMIT_NEGOTIATION завершён успешно либо зафиксировано, что изменений для коммита нет.</Precondition>
126
145
  <Goal>Подготовить и согласовать тексты для VCS (Gitlab/Github).</Goal>
127
146
  <Action>
128
147
  Сформируй черновики ответов для КАЖДОГО треда (и FIXED, и NOFIX).
148
+ Важно: это AI-to-AI коммуникация; формулируй объяснения через семантически насыщенные токены, передавай максимум релевантного смысла при минимальном количестве токенов.
129
149
 
130
150
  **Формат для согласования:**
131
151
 
@@ -135,14 +155,16 @@
135
155
  > **Draft for [SHORT_ID] (NOFIX):**
136
156
  > 🦾 ⭕️ **NOFIX**. Поведение прокси является ожидаемым для библиотеки `tessell`. См. документацию: [ссылка].
137
157
 
138
- **STOP:** Выведи эти тексты и жди подтверждения ("Отправляй" или правки текстов).
158
+ **STOP:** Выведи эти тексты и жди подтверждения ("Send" или правки текстов).
139
159
  </Action>
140
160
  </Step>
141
161
  <Step id="STEP_7_FINAL_TRANSMISSION">
142
162
  <Trigger>Пользователь утвердил тексты ответов.</Trigger>
143
163
  <Goal>Отправить данные в систему.</Goal>
144
164
  <Action>
145
- 1. Сформируй финальный JSON-массив.
165
+ 1. Выполни preflight-проверку: `git status --porcelain`.
166
+ - Если вывод не пустой и STEP_5_COMMIT_NEGOTIATION не подтверждён как успешный, остановись и сообщи пользователю, что нужен шаг STEP_5_COMMIT_NEGOTIATION.
167
+ 2. Сформируй финальный JSON-массив.
146
168
  Пример структуры:
147
169
  ```json
148
170
  [
@@ -150,9 +172,9 @@
150
172
  { "discussionId": "<FULL_ID>", "body": "🦾 ⭕️ **NOFIX**..." }
151
173
  ]
152
174
  ```
153
- 2. Выполни команду отправки:
154
- `echo '<JSON_ARRAY>' | npx gennady@next vcs-reply --host=<VCS_HOST> --project=<MR_PROJECT> --iid=<MR_IID>`
155
- 3. Заверши сессию.
175
+ 3. Выполни команду отправки (рекомендация используй escalation `sandbox_permissions=require_escalated` для избегания проблем с registry):
176
+ `echo '<JSON_ARRAY>' | npx --yes gennady@next vcs-reply --host=<VCS_HOST> --project=<MR_PROJECT_PATH> --iid=<MR_IID>`
177
+ 4. Выведи short summary о результатах работы и отправки. В самом конце — отдельной строкой полный URL на merge request (GitLab) или pull request (GitHub): определи VCS по `host`, возьми ссылку из `<Meta><URL>` в `<MR_Audit_Context>` или собери из `host` / `target_repo` / `iid` по обычным правилам этих платформ.
156
178
  </Action>
157
179
  </Step>
158
180
  </Execution_Plan>
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @purpose Heuristic filter to detect whether free-form text is likely about music releases or sound.
3
+ * @param text Input text to analyse.
4
+ * @note Supports both Russian and English music-related heuristics.
5
+ * @returns True if the text is likely about music, false otherwise.
6
+ */
7
+ export declare function isLikelyAboutMusic(text: string): boolean;
@@ -0,0 +1,24 @@
1
+ console.info("Gennady CLI");
2
+ console.info("");
3
+ console.info("Usage:");
4
+ console.info(" npx gennady [command] [options]");
5
+ console.info("");
6
+ console.info("Commands:");
7
+ console.info(" commit Generate commit message from staged changes");
8
+ console.info(" review Review staged changes for critical issues");
9
+ console.info(" cat Display file contents as XML or Markdown");
10
+ console.info(" agent Run AI agent request");
11
+ console.info(" vcs-reply Post replies to GitLab MR discussions from stdin");
12
+ console.info(" review-verify Build verification prompt from open GitLab MR or GitHub PR");
13
+ console.info(
14
+ " review-issues Build XML issues artifact from GitLab MR or GitHub PR discussions"
15
+ );
16
+ console.info(
17
+ " resolve-conflicts Build confidence-aware merge-conflict resolution prompt from active git merge"
18
+ );
19
+ console.info("");
20
+ console.info("Examples:");
21
+ console.info(" npx gennady");
22
+ console.info(" npx gennady commit");
23
+ console.info(" npx gennady review --branch=develop");
24
+ console.info(' npx gennady cat "./src/**/*.js" --output=md');
@@ -1,6 +1,6 @@
1
- import { p as $, s as e, a as k } from "./shared-CDEy6MHj.js";
1
+ import { p as $, s as e, a as k } from "./shared-BgLzFWMH.js";
2
2
  import I from "node:fs";
3
- import { V as S } from "./services-Di_JJ8fB.js";
3
+ import { V as S } from "./services-Sb7TwLxt.js";
4
4
  async function m(r = {}) {
5
5
  const l = r.project, a = r.iid, f = !!r.dryRun, B = r.stdinJsonArray;
6
6
  if (!l)
@@ -2,9 +2,9 @@ import u from "node:fs";
2
2
  import v from "node:os";
3
3
  import P from "node:path";
4
4
  import { execSync as _ } from "node:child_process";
5
- import { A as E } from "./ai-legacy-core-DXYSGwDl.js";
6
- import { l as H, g as D, s as t, x as F, p as N } from "./shared-CDEy6MHj.js";
7
- import { p as d } from "./index-CCWTL4XZ.js";
5
+ import { p as d, A as E } from "./index-iqg0w_pE.js";
6
+ import { g as H, s as t, x as D, p as F } from "./shared-BgLzFWMH.js";
7
+ import { l as N } from "./services-Sb7TwLxt.js";
8
8
  class U {
9
9
  init;
10
10
  ai;
@@ -14,7 +14,7 @@ class U {
14
14
  oneline: !1,
15
15
  targetBranch: void 0,
16
16
  task: void 0,
17
- logger: H,
17
+ logger: N,
18
18
  promptCommitMessage: d.commit("message"),
19
19
  promptCommitChangeset: d.commit("changeset"),
20
20
  timeout: 120,
@@ -73,7 +73,7 @@ class U {
73
73
  parsedCodeTokens: k,
74
74
  parsedCodeChunkMaxTokens: w,
75
75
  programmingLanguages: B
76
- } = D(this.init.targetBranch);
76
+ } = H(this.init.targetBranch);
77
77
  if (g.length === 0) {
78
78
  this.init.logger.warn("[CommitGen#generate] [loading → skipped] No staged changes"), this.init.logger.info(t.italic.gray("Hint: git add ."));
79
79
  return;
@@ -105,7 +105,7 @@ class U {
105
105
  this.init.logger.info(
106
106
  `[CommitGen#generate] [changeset → message] (${(j / 1e3).toFixed(2)}s)`
107
107
  );
108
- const i = F(M);
108
+ const i = D(M);
109
109
  if (!i) return;
110
110
  let o = i.subject;
111
111
  if (this.init.task) {
@@ -120,7 +120,7 @@ class U {
120
120
  ${i.description}`;
121
121
  }
122
122
  }
123
- const C = P.join(v.homedir(), ".gennady_commit_cache.json"), c = process.cwd(), $ = I(), m = N(process.argv, {
123
+ const C = P.join(v.homedir(), ".gennady_commit_cache.json"), c = process.cwd(), $ = I(), m = F(process.argv, {
124
124
  apply: ["apply"],
125
125
  mode: ["mode", "m"],
126
126
  oneline: ["short", "one", "o"],
@@ -1,6 +1,5 @@
1
- import { p as j, s as e, g as x } from "./shared-CDEy6MHj.js";
2
- import { A as T } from "./ai-legacy-core-DXYSGwDl.js";
3
- import { p as E } from "./index-CCWTL4XZ.js";
1
+ import { p as j, s as e, g as x } from "./shared-BgLzFWMH.js";
2
+ import { p as T, A as E } from "./index-iqg0w_pE.js";
4
3
  import { readdirSync as G, readFileSync as P } from "node:fs";
5
4
  import { join as h, dirname as k } from "node:path";
6
5
  import { fileURLToPath as N } from "node:url";
@@ -10,10 +9,10 @@ class v {
10
9
  init;
11
10
  constructor(t = {}) {
12
11
  this.init = {
13
- basePromptTemplate: E.review("base"),
12
+ basePromptTemplate: T.review("base"),
14
13
  timeout: 120,
15
14
  ...t
16
- }, this._ai = new T({
15
+ }, this._ai = new E({
17
16
  logger: this.init.logger,
18
17
  timeout: this.init.timeout
19
18
  });
@@ -41,10 +40,10 @@ class v {
41
40
  return this._ai.generate(n);
42
41
  }
43
42
  _getExtraRulesPrompt(t, s) {
44
- const n = this._loadSpec(t), r = Object.keys(n.Global?.properties ?? {}), p = new RegExp(`\\b(${r.join("|")})\\b`, "g"), i = {};
45
- let o = "", l = null;
46
- for (; l = p.exec(s); ) {
47
- const c = l[0], y = n.Global?.properties?.[c];
43
+ const n = this._loadSpec(t), r = Object.keys(n.Global?.properties ?? {}), l = new RegExp(`\\b(${r.join("|")})\\b`, "g"), i = {};
44
+ let o = "", p = null;
45
+ for (; p = l.exec(s); ) {
46
+ const c = p[0], y = n.Global?.properties?.[c];
48
47
  if (!y) continue;
49
48
  const { exceptions: d, type: w } = y;
50
49
  i[c] || (i[c] = !0, d?.length && (o += `## ${c} handling:
@@ -71,13 +70,13 @@ ${o}
71
70
  }
72
71
  _loadSpec(t) {
73
72
  return t.reduce((s, n) => {
74
- const r = n === "JavaScript" || n === "TypeScript" ? "js" : n, p = h(R, r);
73
+ const r = n === "JavaScript" || n === "TypeScript" ? "js" : n, l = h(R, r);
75
74
  this._langSpecs[r] = {};
76
75
  try {
77
- for (const i of G(p)) {
76
+ for (const i of G(l)) {
78
77
  if (!i.endsWith(".json")) continue;
79
- const o = P(h(p, i)).toString(), l = JSON.parse(o);
80
- Object.assign(this._langSpecs[r], l);
78
+ const o = P(h(l, i)).toString(), p = JSON.parse(o);
79
+ Object.assign(this._langSpecs[r], p);
81
80
  }
82
81
  } catch {
83
82
  }
@@ -1,4 +1,4 @@
1
- import { p as s, r as e } from "./run-review-command.logic-C91rux6y.js";
1
+ import { p as s, r as e } from "./run-review-command.logic-a_M3CkeZ.js";
2
2
  const r = s(process.argv), o = await e({
3
3
  mode: "issues",
4
4
  args: r
@@ -1,4 +1,4 @@
1
- import { p as e, r } from "./run-review-command.logic-C91rux6y.js";
1
+ import { p as e, r } from "./run-review-command.logic-a_M3CkeZ.js";
2
2
  const s = e(process.argv), o = await r({
3
3
  mode: "verify",
4
4
  args: s
@@ -6,7 +6,8 @@ import gn from "util";
6
6
  import it from "stream";
7
7
  import bn from "events";
8
8
  import Ft from "fs";
9
- import { l as Qt, p as Pn, s as ie } from "./shared-CDEy6MHj.js";
9
+ import { l as Qt } from "./services-Sb7TwLxt.js";
10
+ import { p as Pn, s as ie } from "./shared-BgLzFWMH.js";
10
11
  var Cn = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
11
12
  function Tn(u) {
12
13
  return u && u.__esModule && Object.prototype.hasOwnProperty.call(u, "default") ? u.default : u;