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.
- package/README.md +140 -107
- package/dist/.ai/agents/agent-review-verifier.xml +35 -13
- package/dist/assistant/music/music-filter.d.ts +7 -0
- package/dist/chunks/help.cmd-CWasx25o.js +24 -0
- package/dist/chunks/{index-BQ06E6S4.js → index-5xIgwwKx.js} +2 -2
- package/dist/chunks/{index-CUY8EsN_.js → index-B4m0-PAT.js} +7 -7
- package/dist/chunks/{index-83Uuqvoa.js → index-B5bA2T7A.js} +12 -13
- package/dist/chunks/{index-DKaDIbyw.js → index-B63fYXL2.js} +1 -1
- package/dist/chunks/{index-DNvWeAkM.js → index-C0andxna.js} +1 -1
- package/dist/chunks/{index-Bp_KTwxR.js → index-CNbmXK8M.js} +2 -1
- package/dist/chunks/index-Dqe1TdW4.js +265 -0
- package/dist/chunks/{ai-legacy-core-DXYSGwDl.js → index-iqg0w_pE.js} +38 -25
- package/dist/chunks/run-review-command.logic-a_M3CkeZ.js +267 -0
- package/dist/chunks/services-Sb7TwLxt.js +122 -0
- package/dist/chunks/shared-BgLzFWMH.js +577 -0
- package/dist/cli/cmd/_shared/prompt/io/load-agent-template.io.d.ts +7 -0
- package/dist/cli/cmd/_shared/prompt/logic/build-ai-first-knowledge-block.logic.d.ts +7 -0
- package/dist/cli/cmd/_shared/prompt/logic/build-ai-verify-placeholders.logic.d.ts +16 -0
- package/dist/cli/cmd/_shared/prompt/logic/verify-commands/resolve-verify-commands.logic.d.ts +1 -0
- package/dist/cli/cmd/help/help.cmd.d.ts +1 -0
- package/dist/cli/cmd/resolve-conflicts/_core/io/resolve-conflicts-template-load.io.d.ts +6 -0
- package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-command-args-parse.logic.d.ts +8 -0
- package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-command-run.logic.d.ts +9 -0
- package/dist/cli/cmd/resolve-conflicts/_core/logic/resolve-conflicts-context-git-build.logic.d.ts +10 -0
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-artifact.type.d.ts +9 -0
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-command-args.type.d.ts +8 -0
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-command-result.type.d.ts +11 -0
- package/dist/cli/cmd/resolve-conflicts/_core/types/resolve-conflicts-context-git.type.d.ts +29 -0
- package/dist/cli/cmd/resolve-conflicts/_core/xml/resolve-conflicts-artifact-build.xml.d.ts +16 -0
- package/dist/cli/cmd/resolve-conflicts/_core/xml/resolve-conflicts-render.xml.d.ts +8 -0
- package/dist/cli/cmd/resolve-conflicts/index.d.ts +1 -0
- package/dist/cli/cmd/review/_core/logic/build-ai-first-knowledge-block.logic.d.ts +1 -0
- package/dist/cli/cmd/review/_core/logic/build-ai-verify-placeholders.logic.d.ts +2 -0
- package/dist/cli/cmd/review/_core/logic/verify-commands/resolve-verify-commands.logic.d.ts +1 -0
- package/dist/cli/cmd/review/_core/types/review-command-args.type.d.ts +1 -0
- package/dist/cli/cmd/review/_core/types/review-context-mr.type.d.ts +10 -0
- package/dist/cli/cmd/review/_core/xml/build-review-artifact.xml.d.ts +4 -2
- package/dist/cli/cmd/review/_core/xml/render-review-verify.xml.d.ts +3 -2
- package/dist/cli/utils/ai-legacy/ai-legacy-core.d.ts +1 -1
- package/dist/gennady.js +15 -13
- package/dist/index.js +2 -2
- package/dist/services/ai-client/ai-client.d.ts +1 -0
- package/dist/services/ai-client/providers/ai-model.type.d.ts +33 -0
- package/dist/services/ai-client/providers/open-router/open-router-model.type.d.ts +29 -0
- package/dist/services/ai-client/providers/open-router/open-router-provider.d.ts +9 -0
- package/dist/services/ai-client/providers/openai-like-provider.d.ts +2 -0
- package/dist/services/data-ore/telegram/telegram-data-ore.d.ts +11 -0
- package/dist/services/data-ore/telegram/telegram-data-ore.types.d.ts +5 -0
- package/dist/services/data-ore/telegram/telegram-demo-music-helper.d.ts +9 -0
- package/dist/services/data-ore/telegram/telegram-demo.d.ts +2 -0
- package/dist/services/dbc/parser/dbc-parser.types.d.ts +65 -0
- package/dist/services/dbc/parser/implementations/jsdoc/dbc-jsdoc-parser.d.ts +79 -0
- package/dist/services/logger/logger.d.ts +16 -0
- package/dist/services/vcs-client/{gitlab/vcs-merge-discussions.d.ts → abstract/vcs-client-merge-discussions.d.ts} +9 -13
- package/dist/services/vcs-client/{gitlab/vcs-merge-requests.d.ts → abstract/vcs-client-merge-requests.d.ts} +12 -18
- package/dist/services/vcs-client/abstract/vcs-client.d.ts +13 -0
- package/dist/services/vcs-client/entities/vcs-user.type.d.ts +4 -0
- package/dist/services/vcs-client/gitlab/vcs-gitlab-client.d.ts +8 -5
- package/dist/services/vcs-client/gitlab/vcs-gitlab-merge-discussions.d.ts +30 -0
- package/dist/services/vcs-client/gitlab/vcs-gitlab-merge-requests.d.ts +27 -0
- package/dist/shared/backend/git/git-core.d.ts +3 -2
- package/dist/shared/common/logger.d.ts +4 -5
- package/package.json +17 -4
- package/dist/chunks/index-CCWTL4XZ.js +0 -14
- package/dist/chunks/index-Cmblo_rP.js +0 -14
- package/dist/chunks/run-review-command.logic-C91rux6y.js +0 -273
- package/dist/chunks/services-Di_JJ8fB.js +0 -123
- package/dist/chunks/shared-CDEy6MHj.js +0 -418
- package/dist/cli/cmd/agent/index.d.ts +0 -1
- /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
|
-
|
|
6
|
-
# Generate commit message
|
|
7
|
-
npx gennady
|
|
5
|
+
CLI-инструмент для работы с git-изменениями, merge-конфликтами и GitLab review-пайплайном.
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
npx gennady review
|
|
7
|
+
---
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
npx gennady cat <path1> <path2> ...
|
|
14
|
-
```
|
|
9
|
+
## ⚡ Быстрый старт
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
```bash
|
|
12
|
+
# Справка
|
|
13
|
+
npx gennady help
|
|
17
14
|
|
|
18
|
-
|
|
15
|
+
# По умолчанию показывается справка
|
|
16
|
+
npx gennady
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
# Commit запускается только явно
|
|
19
|
+
npx gennady commit
|
|
20
|
+
```
|
|
23
21
|
|
|
24
22
|
---
|
|
25
23
|
|
|
26
|
-
##
|
|
24
|
+
## 🧩 Что нужно в окружении
|
|
25
|
+
|
|
26
|
+
- Node.js `22+`
|
|
27
|
+
- Git-репозиторий (для команд с git-контекстом)
|
|
28
|
+
- Для GitLab-команд: `GITLAB_PERSONAL_TOKEN`
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
```bash
|
|
31
|
+
# Обязательно для review-verify / review-issues / vcs-reply (live)
|
|
32
|
+
export GITLAB_PERSONAL_TOKEN="<token>"
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
# Опционально (default: /api/v4)
|
|
35
|
+
export GITLAB_API_PATH="/api/v4"
|
|
36
|
+
```
|
|
33
37
|
|
|
34
38
|
---
|
|
35
39
|
|
|
36
|
-
##
|
|
37
|
-
|
|
38
|
-
```sh
|
|
39
|
-
# Basic usage
|
|
40
|
-
npx gennady
|
|
40
|
+
## 🧭 Команды CLI
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
npx gennady --mode=oneline
|
|
42
|
+
### 📝 `commit`
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
npx gennady --mode=detailed
|
|
44
|
+
Генерация commit message из staged-изменений.
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
npx gennady
|
|
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
|
-
|
|
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
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
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
|
-
|
|
66
|
+
### 🔍 `review`
|
|
71
67
|
|
|
72
|
-
|
|
68
|
+
Проверка staged-изменений на критичные проблемы.
|
|
73
69
|
|
|
74
|
-
```
|
|
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
|
-
|
|
75
|
+
**Опции:**
|
|
76
|
+
|
|
77
|
+
- `--branch`, `-b`: ветка для сравнения
|
|
82
78
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
91
|
+
**Опции:**
|
|
88
92
|
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
93
|
+
- `--output`, `-o`: `xml` (по умолчанию) или `md`
|
|
94
|
+
- `--plain`: без ANSI-цветов
|
|
95
|
+
- `--exclude`, `-e`: исключить паттерны
|
|
96
|
+
- `--ext`: фильтр по расширениям
|
|
92
97
|
|
|
93
98
|
---
|
|
94
99
|
|
|
95
|
-
|
|
100
|
+
### ✅ `review-verify`
|
|
96
101
|
|
|
97
|
-
|
|
102
|
+
Собирает prompt для верификации discussion-тредов Merge Request (GitLab).
|
|
98
103
|
|
|
99
|
-
```
|
|
100
|
-
|
|
104
|
+
```bash
|
|
105
|
+
# Автоопределение MR по текущей ветке
|
|
106
|
+
npx gennady review-verify
|
|
101
107
|
|
|
102
|
-
#
|
|
103
|
-
npx gennady
|
|
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
|
-
#
|
|
106
|
-
npx gennady
|
|
112
|
+
# По ref
|
|
113
|
+
npx gennady review-verify group/project!123
|
|
114
|
+
npx gennady review-verify --ref=group/project!123
|
|
107
115
|
|
|
108
|
-
#
|
|
109
|
-
npx gennady
|
|
116
|
+
# Явно project + iid
|
|
117
|
+
npx gennady review-verify --project=group/project --iid=123
|
|
110
118
|
```
|
|
111
119
|
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
133
|
+
### 📄 `review-issues`
|
|
124
134
|
|
|
125
|
-
|
|
135
|
+
Как `review-verify`, но возвращает только XML-артефакт issues.
|
|
126
136
|
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
###
|
|
146
|
+
### 🧠 `resolve-conflicts`
|
|
136
147
|
|
|
137
|
-
|
|
148
|
+
Собирает prompt для AI-разрешения merge-конфликтов с ветвлением по confidence (auto-resolve или диалог с оператором).
|
|
138
149
|
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
165
|
+
---
|
|
158
166
|
|
|
159
|
-
|
|
167
|
+
### 💬 `vcs-reply`
|
|
160
168
|
|
|
161
|
-
|
|
169
|
+
Постинг ответов в GitLab MR discussions из JSON-массива через `stdin`.
|
|
162
170
|
|
|
163
171
|
```bash
|
|
164
|
-
|
|
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
|
-
|
|
181
|
+
**Опции:**
|
|
168
182
|
|
|
169
|
-
-
|
|
170
|
-
-
|
|
171
|
-
-
|
|
183
|
+
- `--project`: путь GitLab-проекта
|
|
184
|
+
- `--iid`: IID merge request
|
|
185
|
+
- `--dry-run`, `--dry`: не отправлять, только показать dry-run вывод
|
|
172
186
|
|
|
173
|
-
|
|
187
|
+
**Формат stdin:**
|
|
174
188
|
|
|
175
|
-
|
|
189
|
+
```json
|
|
190
|
+
[{ "discussionId": "<discussion-id>", "body": "<reply markdown>" }]
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## 🛠️ Типовые сценарии
|
|
196
|
+
|
|
197
|
+
### 1. Верификация MR
|
|
176
198
|
|
|
177
|
-
|
|
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. Нет тестов? Не городи огород, используй
|
|
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. Нужно выполнить специфическую команду (
|
|
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
|
-
# 📝 План Верификации для
|
|
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
|
-
|
|
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:**
|
|
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. Если пользователь сказал "
|
|
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.
|
|
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
|
-
|
|
154
|
-
`echo '<JSON_ARRAY>' | npx gennady@next vcs-reply --host=<VCS_HOST> --project=<
|
|
155
|
-
|
|
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-
|
|
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-
|
|
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 "./
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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:
|
|
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
|
-
} =
|
|
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 =
|
|
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 =
|
|
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-
|
|
2
|
-
import {
|
|
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:
|
|
12
|
+
basePromptTemplate: T.review("base"),
|
|
14
13
|
timeout: 120,
|
|
15
14
|
...t
|
|
16
|
-
}, this._ai = new
|
|
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 ?? {}),
|
|
45
|
-
let o = "",
|
|
46
|
-
for (;
|
|
47
|
-
const 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,
|
|
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(
|
|
76
|
+
for (const i of G(l)) {
|
|
78
77
|
if (!i.endsWith(".json")) continue;
|
|
79
|
-
const o = P(h(
|
|
80
|
-
Object.assign(this._langSpecs[r],
|
|
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
|
}
|
|
@@ -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
|
|
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;
|