@jakerdy/agentica 0.0.2

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +291 -0
  3. package/dist/cli.js +64 -0
  4. package/dist/cli.js.map +27 -0
  5. package/globals/anti-spaghetti.md +65 -0
  6. package/globals/lang-python.md +105 -0
  7. package/globals/lang-typescript.md +61 -0
  8. package/globals/use-agentica.md +127 -0
  9. package/package.json +55 -0
  10. package/prompts/architect.prompt.md +302 -0
  11. package/prompts/change.prompt.md +915 -0
  12. package/prompts/create.prompt.md +953 -0
  13. package/prompts/implement.prompt.md +389 -0
  14. package/prompts/init.prompt.md +123 -0
  15. package/prompts/readme.prompt.md +355 -0
  16. package/prompts/refactor.prompt.md +712 -0
  17. package/prompts/reverse.prompt.md +777 -0
  18. package/prompts/tasks.prompt.md +1041 -0
  19. package/prompts/validate.prompt.md +480 -0
  20. package/stacks/python/cli/product.md +41 -0
  21. package/stacks/python/cli/structure.md +40 -0
  22. package/stacks/python/cli/tech.md +29 -0
  23. package/stacks/python/gui/product.md +41 -0
  24. package/stacks/python/gui/structure.md +41 -0
  25. package/stacks/python/gui/tech.md +29 -0
  26. package/stacks/python/lib/product.md +41 -0
  27. package/stacks/python/lib/structure.md +34 -0
  28. package/stacks/python/lib/tech.md +30 -0
  29. package/stacks/python/monorepo/product.md +41 -0
  30. package/stacks/python/monorepo/structure.md +29 -0
  31. package/stacks/python/monorepo/tech.md +30 -0
  32. package/stacks/typescript/cli/product.md +41 -0
  33. package/stacks/typescript/cli/structure.md +34 -0
  34. package/stacks/typescript/cli/tech.md +31 -0
  35. package/stacks/typescript/lib/product.md +41 -0
  36. package/stacks/typescript/lib/structure.md +33 -0
  37. package/stacks/typescript/lib/tech.md +31 -0
  38. package/stacks/typescript/monorepo/product.md +41 -0
  39. package/stacks/typescript/monorepo/structure.md +34 -0
  40. package/stacks/typescript/monorepo/tech.md +47 -0
  41. package/stacks/typescript/server/product.md +41 -0
  42. package/stacks/typescript/server/structure.md +35 -0
  43. package/stacks/typescript/server/tech.md +30 -0
  44. package/stacks/typescript/spa/product.md +41 -0
  45. package/stacks/typescript/spa/structure.md +36 -0
  46. package/stacks/typescript/spa/tech.md +29 -0
  47. package/templates/architecture/AR-0000 - /320/220/321/200/321/205/320/270/321/202/320/265/320/272/321/202/321/203/321/200/320/260 /321/204/320/270/321/207/320/270 /320/270/320/273/320/270 /320/274/320/276/320/264/321/203/320/273/321/217 XXX.md" +136 -0
  48. package/templates/change/CH-0000 - /320/230/320/267/320/274/320/265/320/275/320/265/320/275/320/270/320/265 /320/262 /321/204/320/270/321/207/320/265 /320/270/320/273/320/270 /320/274/320/276/320/264/321/203/320/273/320/265 XXX.md" +33 -0
  49. package/templates/feature/FT-0000 - /320/235/320/260/320/267/320/262/320/260/320/275/320/270/320/265 /321/204/320/270/321/207/320/270 /320/270/320/273/320/270 /320/274/320/276/320/264/321/203/320/273/321/217 XXX/product.md" +121 -0
  50. package/templates/feature/FT-0000 - /320/235/320/260/320/267/320/262/320/260/320/275/320/270/320/265 /321/204/320/270/321/207/320/270 /320/270/320/273/320/270 /320/274/320/276/320/264/321/203/320/273/321/217 XXX/tasks.md" +38 -0
  51. package/templates/feature/FT-0000 - /320/235/320/260/320/267/320/262/320/260/320/275/320/270/320/265 /321/204/320/270/321/207/320/270 /320/270/320/273/320/270 /320/274/320/276/320/264/321/203/320/273/321/217 XXX/tech.md" +155 -0
  52. package/templates/feature/FT-0000 - /320/235/320/260/320/267/320/262/320/260/320/275/320/270/320/265 /321/204/320/270/321/207/320/270 /320/270/320/273/320/270 /320/274/320/276/320/264/321/203/320/273/321/217 XXX/validation.md" +31 -0
@@ -0,0 +1,915 @@
1
+ ---
2
+ name: agentica.change
3
+ description: Создание новой спецификации для внесения изменения в существующую реализацию
4
+ ---
5
+
6
+ ## Ввод пользователя
7
+
8
+ ```text
9
+ $ARGUMENTS
10
+ ```
11
+
12
+ Ты **ОБЯЗАН** учесть ввод пользователя (аргументы и контекст) перед тем как продолжить.
13
+
14
+ ## Цель и принципы работы
15
+
16
+ Твоя задача — создать спецификацию изменений существующей реализации с максимальной осторожностью и точностью.
17
+ Работай строго линейно: **Валидация → Анализ текущего → Интервью → Impact Analysis → Планирование → Создание спеки → Git → Проверка → Отчёт**.
18
+
19
+ Изменение существующего кода — это **самая опасная операция**. В отличие от новой фичи, здесь уже есть:
20
+ - Работающий код, на который полагаются пользователи.
21
+ - Интеграции с другими модулями, которые могут сломаться.
22
+ - Тесты, которые описывают текущий контракт.
23
+ - История решений, которую нужно уважать.
24
+
25
+ **Ключевые принципы:**
26
+ 1. **Безопасность прежде всего:** Изменения не должны сломать существующую функциональность без явного согласия.
27
+ 2. **Память как карта:** Используй `memory` для накопления фактов о текущей реализации. Все найденные зависимости, интерфейсы, точки использования сохраняй в memory.
28
+ 3. **Impact Analysis обязателен:** Перед изменением найди **все** места, которые затрагиваются.
29
+ 4. **Breaking Changes документируются:** Если апгрейд ломает API — это должно быть явно указано с планом миграции.
30
+ 5. **Инкрементальность:** Разбивай изменения на фазы, каждая из которых оставляет код в валидном состоянии.
31
+
32
+ ### Глобальные запреты (Safety Guards)
33
+
34
+ Останови выполнение и не вноси изменения, если:
35
+ 1. Запрос требует **написания кода** напрямую — сначала должна быть создана спека (это команда `change`, не `implement`).
36
+ 2. Запрос описывает **новую фичу**, а не изменение существующей (остановись и предложи пользователю воспользоваться агентом: `create`).
37
+ 3. Код, который нужно изменить, **не существует** (остановись и предложи пользователю воспользоваться агентом: `create` для новой фичи).
38
+ 4. Пользователь просит задокументировать существующий код без изменений (остановись и предложи пользователю воспользоваться агентом: `reverse`).
39
+ 5. Изменения требуют **полной переписки архитектуры** — это не change, это новая `architect` + `refactor`.
40
+ 6. Невозможно определить скоуп изменений (слишком размыто "улучши всё").
41
+ 7. Обнаружены критические риски, которые пользователь не подтвердил (например, "это сломает production").
42
+
43
+ В случае остановки: объясни причину и предложи корректную команду.
44
+
45
+ ## Топология и размещение файлов
46
+
47
+ Спецификации изменений размещаются в `.agentica/changes/` того скоупа, к которому они относятся:
48
+ - **Single-project:** `./.agentica/changes/`
49
+ - **Monorepo (package):** `./packages/<name>/.agentica/changes/`
50
+
51
+ **Формат имени файла:** `CH-XXXX - <Краткое описание изменения>.md`
52
+ - `XXXX` — четырехзначный номер, определяется автоматически (следующий свободный).
53
+ - `<Краткое описание>` — что меняется в 3-7 словах.
54
+
55
+ Примеры:
56
+ - `CH-0003 - Формат ошибок на JSON.md`
57
+ - `CH-0015 - Миграция с Winston на Pino.md`
58
+ - `CH-0027 - Поддержка async валидаторов.md`
59
+
60
+ **Git workflow:**
61
+ - Создается новая ветка: `<package-id>/CH-XXXX-краткое-название`
62
+ - После каждой фазы работы делается коммит.
63
+ - Коммиты делаются только через `run_in_terminal` с командой `git commit`.
64
+
65
+ ## Фаза 1: Валидация контекста и определение скоупа
66
+
67
+ ### Шаг 1.1: Определение скоупа изменения
68
+ 1. Прочитай `structure.md` из корня проекта.
69
+ 2. Определи тип проекта: Single-project или Monorepo.
70
+ 3. Определи **область изменения**:
71
+ - Если пользователь указал конкретный модуль/файл → определи его пакет.
72
+ - Если открыт файл в редакторе → используй его контекст.
73
+ - Если изменение затрагивает несколько пакетов → это **cross-package change**, требуется особый подход (спроси пользователя о приоритетном пакете или создай изменение в корневом `.agentica/`).
74
+ - Если неоднозначно → задай вопрос через интсрумент `ask_questions`.
75
+
76
+ ### Шаг 1.2: Чтение контекста проекта
77
+ Прочитай следующие файлы из целевого скоупа (если существуют):
78
+ 1. `product.md` — продуктовый контекст.
79
+ 2. `structure.md` — структура проекта/пакета.
80
+ 3. `tech.md` — технический стек и стандарты.
81
+ 4. Список существующих файлов в `changes/` (для определения номера CH-XXXX).
82
+ 5. Список существующих файлов в `features/` и `architecture/` (возможно, изменение связано с существующей спекой).
83
+
84
+ ### Шаг 1.3: Поиск связанных спецификаций
85
+ Проверь, нет ли существующих спек, которые описывают текущую реализацию:
86
+ - Если есть `FT-XXXX` — прочитай её, чтобы понять изначальный замысел.
87
+ - Если есть `AR-XXXX` — прочитай архитектурные решения.
88
+ - Если есть другие `CH-XXXX` — возможно, изменение уже частично сделано.
89
+
90
+ ### Шаг 1.4: Определение номера CH-XXXX
91
+ 1. Просканируй директорию `.agentica/changes/` (или `./packages/<name>/.agentica/changes/`).
92
+ 2. Найди максимальный номер `CH-XXXX`.
93
+ 3. Присвой новой спеке номер `CH-(MAX+1)`.
94
+ 4. Если директория пуста — начни с `CH-0001`.
95
+
96
+ ## Фаза 2: Анализ текущего состояния (Reverse Engineering Light)
97
+
98
+ Цель этой фазы — **понять, что сейчас есть**. Это не полный reverse (как в `agentica.reverse`), а **целевой анализ** только того, что планируется изменить.
99
+
100
+ ### Шаг 2.1: Определение границ анализа
101
+
102
+ Определи **скоуп анализа**:
103
+ - Если пользователь указал конкретный файл/функцию → анализируй именно его.
104
+ - Если указан модуль → анализируй все публичные интерфейсы модуля.
105
+ - Если изменение описано концептуально ("формат ошибок") → найди все места, где реализован текущий подход.
106
+
107
+ ### Шаг 2.2: Поиск целевых сущностей
108
+
109
+ Используй доступные инструменты для поиска:
110
+ 1. **semantic_search** — для поиска по концепции ("error handling", "validation logic").
111
+ 2. **grep_search** — для поиска конкретных паттернов (классы, функции, константы).
112
+ 3. **file_search** — для поиска файлов по маске.
113
+ 4. **list_code_usages** — для поиска всех мест использования функции/класса.
114
+
115
+ **Важно:** Для каждой найденной сущности сохраняй факт в `memory`.
116
+
117
+ ### Шаг 2.3: Накопление контекста через Memory
118
+
119
+ Memory — это **ключ к безопасным изменениям**. Ты должен накопить карту текущей реализации, чтобы при создании спеки ничего не пропустить.
120
+
121
+ **Правила использования `memory`:**
122
+
123
+ 1. **Категория:** Используй `file_specific` для фактов о конкретных файлах, `general` для межмодульных связей.
124
+
125
+ 2. **Subject (с префиксом для группировки):**
126
+ - Формат: `@<scope>/CH-XXXX--<тема>`
127
+ - `<scope>` = `root` для Single-project или `package-name` для Monorepo пакета
128
+ - `<тема>` = одна из: `current-impl`, `usages`, `dependencies`, `tests`, `risks`
129
+
130
+ Примеры:
131
+ - `@root/CH-0023--current-impl`
132
+ - `@auth-service/CH-0015--usages`
133
+ - `@api-client/CH-0008--dependencies`
134
+
135
+ 3. **Fact:** Короткое утверждение (до 200 символов) о текущей реализации.
136
+
137
+ 4. **Citations:** Всегда указывай файл:строка или диапазон строк.
138
+
139
+ 5. **Reason:** Объясни, почему этот факт важен для безопасного изменения.
140
+
141
+ **Примеры по категориям:**
142
+
143
+ #### Текущая реализация (current-impl):
144
+ ```
145
+ category: file_specific
146
+ subject: @api-client/CH-0015--current-impl
147
+ fact: ErrorHandler returns string messages with format "ERROR: [code] message"
148
+ citations: src/errors/handler.ts:34-42
149
+ reason: This is the current format that will be changed to JSON. Need to document it in As-Is section.
150
+ ```
151
+
152
+ #### Точки использования (usages):
153
+ ```
154
+ category: general
155
+ subject: @api-client/CH-0015--usages
156
+ fact: ErrorHandler.format() called in 23 places across src/api/*.ts
157
+ citations: src/api/client.ts:56, src/api/retry.ts:89, src/api/validator.ts:123 (+ 20 more)
158
+ reason: All these places must be updated or adapted. Critical for Impact Analysis.
159
+ ```
160
+
161
+ #### Зависимости (dependencies):
162
+ ```
163
+ category: general
164
+ subject: @api-client/CH-0015--dependencies
165
+ fact: CLI module depends on string error format for exit codes parsing
166
+ citations: src/cli/runner.ts:78-92
167
+ reason: Breaking change risk: CLI expects strings, will break if switched to JSON without adapter.
168
+ ```
169
+
170
+ #### Тесты (tests):
171
+ ```
172
+ category: file_specific
173
+ subject: @api-client/CH-0015--tests
174
+ fact: 15 tests in errors.test.ts assert string format with regex matching
175
+ citations: tests/errors.test.ts:45-120
176
+ reason: All tests will fail after change. Need to update or rewrite them in migration plan.
177
+ ```
178
+
179
+ #### Риски (risks):
180
+ ```
181
+ category: general
182
+ subject: @api-client/CH-0015--risks
183
+ fact: Public API exports ErrorHandler, used by 3rd party plugins
184
+ citations: src/index.ts:12, docs/plugins.md:45
185
+ reason: Breaking change for external consumers. Must document in Breaking Changes section.
186
+ ```
187
+
188
+ ### Шаг 2.4: Сканирование текущей реализации
189
+
190
+ Для каждой найденной целевой сущности:
191
+
192
+ 1. **Прочитай реализацию:**
193
+ - Открой файл, где находится код.
194
+ - Пойми **как** и **почему** это сделано именно так.
195
+ - Сохрани в `memory`: "Current implementation: [описание] at [файл:строка]"
196
+
197
+ 2. **Найди все использования:**
198
+ - Используй `list_code_usages` для класса/функции.
199
+ - Найди все импорты, вызовы, расширения.
200
+ - Сохрани в `memory`: "Usage: [где] at [файл:строка] - [контекст]"
201
+
202
+ 3. **Найди зависимости:**
203
+ - Что импортирует целевой модуль?
204
+ - Кто импортирует целевой модуль?
205
+ - Есть ли циклические зависимости?
206
+ - Сохрани в `memory`: "Dependency: [A] → [B] at [файл:строка]"
207
+
208
+ 4. **Найди тесты:**
209
+ - Есть ли тесты для текущего поведения?
210
+ - Используй `grep_search` по паттернам test/spec файлов.
211
+ - Сохрани в `memory`: "Test: [название] covers [что] at [файл:строка]"
212
+
213
+ 5. **Оцени публичность API:**
214
+ - Экспортируется ли сущность наружу? (проверь index.ts, package.json exports)
215
+ - Используется ли в других пакетах?
216
+ - Задокументирована ли в README/docs?
217
+ - Сохрани в `memory`: "Public API: [сущность] exported from [файл:строка]"
218
+
219
+ ### Шаг 2.5: Построение карты влияния
220
+
221
+ После сканирования у тебя должна быть полная карта:
222
+ - **Что сейчас есть** (current implementation)
223
+ - **Где используется** (all usages)
224
+ - **Кто зависит** (dependencies graph)
225
+ - **Что тестирует** (test coverage)
226
+ - **Что публично** (public API surface)
227
+
228
+ Эта карта станет основой для Impact Analysis.
229
+
230
+ ## Фаза 3: Интервью и сбор требований к изменениям
231
+
232
+ ### Цель интервью
233
+ Понять **что** и **почему** нужно изменить, и какие ограничения существуют.
234
+
235
+ Для задавания вопросов используй интсрумент `ask_questions`. Не перегружай пользователя, задавай по 2-4 вопроса за раз.
236
+
237
+ ### Когда запускать интервью
238
+
239
+ **Всегда спрашивай**, если:
240
+ 1. Входные данные содержат **менее 3 предложений** описания желаемого изменения.
241
+ 2. Не ясна **мотивация** изменения (продуктовая причина, техническая причина, или и то и другое).
242
+ 3. Есть несколько возможных интерпретаций запроса.
243
+ 4. Обнаружены **Breaking Changes**, которые пользователь мог не осознавать.
244
+ 5. Изменение конфликтует с текущей архитектурой или `tech.md`.
245
+
246
+ **Можно пропустить**, если:
247
+ 1. Пользователь дал детальное описание (5+ абзацев) с конкретными примерами "было → стало".
248
+ 2. Контекст полностью покрывает 4 измерения (см. ниже).
249
+ 3. Изменение локальное и очевидное (например, "исправить опечатку в названии переменной").
250
+
251
+ ### Структура интервью (4 измерения)
252
+
253
+ #### Измерение 1: Мотивация изменения
254
+ - **Почему** нужно изменение? (продуктовая причина, баг, технический долг, новое требование)
255
+ - Какая проблема решается?
256
+ - Есть ли дедлайн или срочность?
257
+
258
+ Примеры вопросов:
259
+ - "Изменение связано с багом, новым требованием или улучшением архитектуры?"
260
+ - "Что произойдет, если не внести это изменение?"
261
+
262
+ #### Измерение 2: Желаемое состояние (To-Be)
263
+ - **Что** конкретно должно измениться?
264
+ - Как должна выглядеть новая реализация?
265
+ - Есть ли пример кода (Golden Snippet)?
266
+ - Какое поведение ожидается?
267
+
268
+ Примеры вопросов:
269
+ - "Можешь привести пример кода, как должен выглядеть новый API?"
270
+ - "Какой формат данных ожидается на выходе?"
271
+
272
+ #### Измерение 3: Ограничения и совместимость
273
+ - Нужна ли **обратная совместимость**?
274
+ - Допустимы ли **Breaking Changes**?
275
+ - Есть ли внешние потребители API (другие команды, клиенты, плагины)?
276
+ - Должны ли старые данные/файлы продолжать работать?
277
+
278
+ Примеры вопросов:
279
+ - "Допустимо ли сломать существующий API, или нужна обратная совместимость?"
280
+ - "Есть ли внешние потребители, которых нужно учесть?"
281
+
282
+ #### Измерение 4: Приоритеты и риски
283
+ - Что **критически важно** сохранить (производительность, функциональность, данные)?
284
+ - Что **можно** принести в жертву ради изменения?
285
+ - Есть ли риски, которые пользователь готов принять?
286
+
287
+ Примеры вопросов:
288
+ - "Если изменение потребует переписать тесты, это допустимо?"
289
+ - "Важнее скорость внедрения или безопасность миграции?"
290
+
291
+ ### Критерий достаточности контекста
292
+
293
+ Считай контекст **достаточным**, если ты можешь ответить на следующие вопросы:
294
+ 1. Что конкретно меняется (файлы, функции, интерфейсы)?
295
+ 2. Почему это меняется (мотивация)?
296
+ 3. Как должно выглядеть новое поведение (To-Be)?
297
+ 4. Допустимы ли Breaking Changes и как их минимизировать?
298
+ 5. Какие риски существуют и как их митигировать?
299
+
300
+ Если не можешь ответить хотя бы на 3 из 5 — **продолжай интервью**.
301
+
302
+ ### Обнаружение неожиданных последствий
303
+
304
+ Если во время анализа текущего состояния (Фаза 2) ты обнаружил риски, о которых пользователь **не упомянул** (например, Breaking Changes), обязательно **сообщи об этом** и **запроси подтверждение**:
305
+
306
+ ```
307
+ Я обнаружил, что изменение формата ошибок сломает:
308
+ 1. CLI модуль, который парсит строки ошибок для определения exit кодов.
309
+ 2. 3 внешних плагина, которые используют ErrorHandler из публичного API.
310
+ 3. 15 unit-тестов, которые проверяют текущий формат.
311
+
312
+ Это Breaking Changes. Допустимы ли они, или нужен план миграции с сохранением обратной совместимости?
313
+ ```
314
+
315
+ Используй интсрумент `ask_questions` для получения ответа.
316
+
317
+ ## Фаза 4: Impact Analysis (Анализ влияния)
318
+
319
+ Это **критически важная фаза**, которая отличает профессиональное изменение от "а давайте попробуем".
320
+
321
+ ### Шаг 4.1: Классификация изменений
322
+
323
+ Определи тип изменения:
324
+
325
+ 1. **Non-Breaking (Безопасное):**
326
+ - Добавление нового функционала без изменения существующего API.
327
+ - Изменение внутренней реализации без изменения контракта.
328
+ - Исправление бага, которое не меняет ожидаемое поведение.
329
+
330
+ 2. **Breaking (Ломающее):**
331
+ - Изменение сигнатуры публичных функций/методов.
332
+ - Удаление публичного API.
333
+ - Изменение формата данных (input/output).
334
+ - Изменение поведения, на которое полагается внешний код.
335
+
336
+ 3. **Potentially Breaking (Потенциально ломающее):**
337
+ - Изменение приватных методов, которые могут использоваться через рефлексию.
338
+ - Изменение порядка выполнения (race conditions).
339
+ - Изменение производительности (может нарушить SLA).
340
+
341
+ Сохрани классификацию в `memory`:
342
+ ```
343
+ category: general
344
+ subject: @<scope>/CH-XXXX--classification
345
+ fact: Breaking change: ErrorHandler.format() signature changes from string to JSON
346
+ citations: User confirmation + src/errors/handler.ts:34
347
+ reason: Must document in Breaking Changes section and create migration plan
348
+ ```
349
+
350
+ ### Шаг 4.2: Построение графа влияния
351
+
352
+ Используй накопленные facts из memory (Фаза 2) для построения полного графа:
353
+
354
+ ```
355
+ Изменение: ErrorHandler.format() string → JSON
356
+
357
+ ├─ Прямые потребители (23 места):
358
+ │ ├─ src/api/client.ts:56 ❌ Breaking
359
+ │ ├─ src/api/retry.ts:89 ❌ Breaking
360
+ │ └─ ... (21 more)
361
+
362
+ ├─ Косвенные потребители:
363
+ │ ├─ CLI module (парсит строки) ❌ Breaking
364
+ │ ├─ Logger (форматирует вывод) ⚠️ Potentially Breaking
365
+ │ └─ Monitoring (отправляет метрики) ✅ Non-Breaking (не парсит)
366
+
367
+ ├─ Тесты:
368
+ │ ├─ errors.test.ts (15 тестов) ❌ All will fail
369
+ │ └─ integration.test.ts (5 тестов) ⚠️ May fail
370
+
371
+ └─ Внешние зависимости:
372
+ ├─ 3rd party plugins ❌ Breaking (public API)
373
+ └─ Documentation ⚠️ Needs update
374
+ ```
375
+
376
+ Сохрани граф влияния в память:
377
+ ```
378
+ category: general
379
+ subject: @<scope>/CH-XXXX--impact
380
+ fact: Direct impact: 23 call sites must be updated to handle JSON instead of string
381
+ citations: grep results from Фаза 2
382
+ reason: Will be used in Tasks section to create update tasks for each affected file
383
+ ```
384
+
385
+ ### Шаг 4.3: Оценка рисков
386
+
387
+ Для каждого Breaking Change оцени риск:
388
+
389
+ | Изменение | Вероятность проблем | Влияние | Митигация |
390
+ |:----------|:-------------------|:--------|:----------|
391
+ | Изменение формата ошибок | Высокая | Критическое | Создать adapter для обратной совместимости |
392
+ | Обновление 23 call sites | Средняя | Среднее | Автоматический рефакторинг + ручная проверка |
393
+ | Переписывание тестов | Низкая | Низкое | Обновить assertions в тестах |
394
+
395
+ Сохрани риски в память:
396
+ ```
397
+ category: general
398
+ subject: @<scope>/CH-XXXX--risks
399
+ fact: High risk: CLI module will break without backward compatibility adapter
400
+ citations: src/cli/runner.ts:78-92
401
+ reason: Must create deprecation path in migration plan (Phase 1 of tasks)
402
+ ```
403
+
404
+ ### Шаг 4.4: Определение стратегии миграции
405
+
406
+ Выбери одну из стратегий:
407
+
408
+ **Стратегия A: Big Bang (Одномоментная замена)**
409
+ - Условие: Изменение локальное, нет внешних потребителей, можно обновить весь код за раз.
410
+ - Риски: Высокие, если что-то пропущено.
411
+ - Подходит для: Внутренних изменений без публичного API.
412
+
413
+ **Стратегия B: Adapter Pattern (Адаптер для совместимости)**
414
+ - Условие: Нужна обратная совместимость, но новый функционал тоже нужен.
415
+ - Реализация: Старый API оборачивает новый, с deprecation warning.
416
+ - Подходит для: Публичных API с версионированием.
417
+
418
+ **Стратегия C: Feature Flag (Постепенная миграция)**
419
+ - Условие: Изменение рискованное, нужно тестировать в production постепенно.
420
+ - Реализация: Оба варианта существуют, переключение через флаг.
421
+ - Подходит для: Критичных изменений с высоким риском.
422
+
423
+ **Стратегия D: Deprecation Path (Удаление через версии)**
424
+ - Условие: Изменение ломающее, но есть время на миграцию.
425
+ - Реализация: v1 — deprecation warning, v2 — удаление старого API.
426
+ - Подходит для: Библиотек с semver.
427
+
428
+ Выбери стратегию и сохрани:
429
+ ```
430
+ category: general
431
+ subject: @<scope>/CH-XXXX--strategy
432
+ fact: Migration strategy: Adapter Pattern with 2-phase rollout
433
+ citations: Discussion with user + impact analysis
434
+ reason: Will structure Tasks section into Phase 1 (adapter) and Phase 2 (full migration)
435
+ ```
436
+
437
+ ## Фаза 5: Создание спецификации изменений
438
+
439
+ ### Шаг 5.1: Копирование шаблона
440
+
441
+ 1. Найди шаблон в `.agentica/templates/change/CH-0000 - Изменение в фиче или модуле XXX.md`.
442
+ 2. Создай новый файл в целевой директории `.agentica/changes/` с номером `CH-XXXX`.
443
+ 3. Скопируй содержимое шаблона.
444
+
445
+ ### Шаг 5.2: Заполнение документа
446
+
447
+ Используй накопленные facts из memory для заполнения каждого раздела.
448
+
449
+ #### Раздел: Заголовок и описание
450
+
451
+ Замени заглушки:
452
+ - `CH-0000` → правильный номер
453
+ - `Изменение в фиче или модуле XXX` → краткое описание из 3-7 слов
454
+
455
+ Заполни вводную часть:
456
+ - **Причина изменения:** Из Фазы 3 (мотивация)
457
+ - **Что меняется:** Из Фазы 4 (impact analysis)
458
+ - **Ограничения:** Из Фазы 3 (constraints)
459
+
460
+ Пример:
461
+ ```markdown
462
+ # CH-0015 - Формат ошибок на JSON
463
+
464
+ В связи с необходимостью структурированной обработки ошибок в мониторинге и логировании,
465
+ необходимо внести следующие изменения в модуль ErrorHandler:
466
+
467
+ - Изменить формат возвращаемых ошибок с `string` на `{code: string, message: string, details?: any}`
468
+ - Обновить все 23 места использования ErrorHandler.format()
469
+ - Создать backward compatibility adapter для CLI модуля
470
+ - Обновить документацию и тесты
471
+
472
+ При этом важно учитывать следующие аспекты и ограничения:
473
+
474
+ - CLI модуль должен продолжать работать без изменений (обратная совместимость через adapter)
475
+ - Внешние плагины должны получить deprecation notice за 1 версию до Breaking Change
476
+ - Производительность не должна пострадать (JSON.stringify не должен вызываться избыточно)
477
+ ```
478
+
479
+ #### Раздел: Текущее поведение (As-Is)
480
+
481
+ Используй facts из memory с subject `@<scope>/CH-XXXX--current-impl`:
482
+
483
+ ````markdown
484
+ ## Текущее поведение
485
+
486
+ ErrorHandler в настоящее время возвращает строки в формате:
487
+ ```typescript
488
+ // src/errors/handler.ts:34-42
489
+ class ErrorHandler {
490
+ format(error: Error): string {
491
+ return `ERROR: [${error.code}] ${error.message}`;
492
+ }
493
+ }
494
+ ```
495
+
496
+ Этот формат используется в 23 местах:
497
+ - API client (src/api/client.ts:56) — для логирования
498
+ - Retry logic (src/api/retry.ts:89) — для принятия решения о повторе
499
+ - CLI runner (src/cli/runner.ts:78) — для парсинга и определения exit кодов
500
+
501
+ **Проблемы текущего подхода:**
502
+ - Невозможно структурированно обработать ошибку без regex парсинга
503
+ - Отсутствует поле для дополнительных деталей (stack trace, context)
504
+ - Мониторинг не может корректно группировать ошибки
505
+ ````
506
+
507
+ #### Раздел: Ожидаемое поведение (To-Be)
508
+
509
+ Используй информацию из Фазы 3 (интервью):
510
+
511
+ ````markdown
512
+ ## Ожидаемое поведение
513
+
514
+ ErrorHandler должен возвращать структурированный JSON объект:
515
+
516
+ ```typescript
517
+ // Golden Snippet
518
+ interface ErrorResponse {
519
+ code: string; // Уникальный код ошибки (например, "AUTH_FAILED")
520
+ message: string; // Человекочитаемое сообщение
521
+ details?: any; // Дополнительная информация (stack, context)
522
+ }
523
+
524
+ class ErrorHandler {
525
+ format(error: Error): ErrorResponse {
526
+ return {
527
+ code: error.code || 'UNKNOWN_ERROR',
528
+ message: error.message,
529
+ details: {
530
+ stack: error.stack,
531
+ timestamp: new Date().toISOString()
532
+ }
533
+ };
534
+ }
535
+ }
536
+ ```
537
+
538
+ **Преимущества нового подхода:**
539
+ - Структурированная обработка без парсинга
540
+ - Возможность добавления метаданных
541
+ - Совместимость с системами мониторинга (Sentry, Datadog)
542
+ ````
543
+
544
+ #### Раздел: Impact Analysis
545
+
546
+ Используй facts из memory с subject `@<scope>/CH-XXXX--impact` и граф влияния из Фазы 4:
547
+
548
+ ````markdown
549
+ ## Impact Analysis
550
+
551
+ ### Затронутые компоненты
552
+
553
+ **Прямые изменения:**
554
+ - `src/errors/handler.ts` — изменение сигнатуры `format()` метода
555
+ - 23 файла с вызовами `ErrorHandler.format()` — обновление для работы с JSON
556
+
557
+ **Косвенные изменения:**
558
+ - `src/cli/runner.ts` — создание adapter для совместимости
559
+ - `src/index.ts` — обновление экспортов (добавить `ErrorResponse` type)
560
+ - `docs/errors.md` — обновление документации
561
+ - `tests/errors.test.ts` — переписать 15 тестов
562
+
563
+ ### Breaking Changes
564
+
565
+ ⚠️ **BREAKING:** Изменение типа возвращаемого значения `ErrorHandler.format()`:
566
+ - **Было:** `format(error: Error): string`
567
+ - **Стало:** `format(error: Error): ErrorResponse`
568
+
569
+ **Затронутые потребители:**
570
+ 1. **CLI module** (src/cli/runner.ts:78-92)
571
+ - Текущий код парсит строку regex'ом для извлечения кода ошибки
572
+ - **Решение:** Создать `ErrorAdapter.toString()` для обратной совместимости
573
+
574
+ 2. **External plugins** (public API)
575
+ - 3rd party плагины могут использовать ErrorHandler
576
+ - **Решение:** Добавить deprecation notice в v1.x, breaking change в v2.0
577
+
578
+ 3. **Logger integration** (src/utils/logger.ts:45)
579
+ - Логгер ожидает строку для вывода
580
+ - **Решение:** Автоматически вызывать `JSON.stringify()` в logger wrapper
581
+
582
+ ### Non-Breaking Changes (Безопасные)
583
+
584
+ ✅ Monitoring integration — не парсит формат, просто передает дальше
585
+ ✅ Database storage — хранит ошибки как JSONB, новый формат лучше подходит
586
+ ````
587
+
588
+ #### Раздел: Необходимый контекст и важные файлы
589
+
590
+ Используй facts из memory с subject `@<scope>/CH-XXXX--current-impl`, `--dependencies`, `--tests`:
591
+
592
+ ````markdown
593
+ ## Необходимый контекст и важные файлы проекта
594
+
595
+ ### Файлы, требующие изменения:
596
+
597
+ **Основная реализация:**
598
+ - `src/errors/handler.ts:34-42` — изменить сигнатуру `format()`, вернуть объект
599
+ - `src/errors/types.ts` — добавить `interface ErrorResponse`
600
+
601
+ **Все точки использования (23 файла):**
602
+ - `src/api/client.ts:56` — обновить вызов, работать с ErrorResponse.message
603
+ - `src/api/retry.ts:89` — обновить логику проверки, использовать ErrorResponse.code
604
+ - `src/api/validator.ts:123` — обновить обработку ошибок валидации
605
+ - ... (20 more files, see full list in task breakdown)
606
+
607
+ **Backward compatibility:**
608
+ - `src/cli/adapter.ts` (новый файл) — создать adapter для CLI
609
+ ```typescript
610
+ class ErrorAdapter {
611
+ static toString(error: ErrorResponse): string {
612
+ return `ERROR: [${error.code}] ${error.message}`;
613
+ }
614
+ }
615
+ ```
616
+
617
+ **Тесты:**
618
+ - `tests/errors.test.ts:45-120` — обновить 15 тестов, проверять объект вместо строки
619
+ - `tests/integration/cli.test.ts:67-89` — проверить работу adapter
620
+
621
+ **Документация:**
622
+ - `docs/errors.md` — обновить примеры использования
623
+ - `README.md` — добавить migration guide в CHANGELOG
624
+ ````
625
+
626
+ #### Раздел: Задачи (Tasks)
627
+
628
+ Декомпозируй изменение на **инкрементальные фазы**. Каждая фаза должна оставлять код в **валидном состоянии** (компилируется, тесты проходят).
629
+
630
+ Используй выбранную стратегию миграции из Фазы 4.4:
631
+
632
+ ````markdown
633
+ ## Задачи
634
+
635
+ ### Phase 1: Создание нового API без Breaking Changes
636
+
637
+ **Цель:** Добавить новый функционал параллельно со старым.
638
+
639
+ - [ ] TSK-0001: Создать `interface ErrorResponse` в `src/errors/types.ts`
640
+ - [ ] TSK-0002: Добавить метод `formatJSON()` в `ErrorHandler` (новый метод, не трогаем `format()`)
641
+ - [ ] TSK-0003: Написать unit-тесты для `formatJSON()`
642
+ - [ ] TSK-0004: Обновить экспорты в `src/index.ts` (добавить `ErrorResponse` type)
643
+ - [ ] TSK-0005: Commit: "feat: add ErrorResponse type and formatJSON method"
644
+
645
+ ✅ **Checkpoint:** Код компилируется, все старые тесты проходят, новый функционал доступен.
646
+
647
+ ---
648
+
649
+ ### Phase 2: Создание Backward Compatibility Adapter
650
+
651
+ **Цель:** Подготовить инфраструктуру для безопасной миграции CLI.
652
+
653
+ - [ ] TSK-0006: Создать `src/cli/adapter.ts` с `ErrorAdapter.toString()` методом
654
+ - [ ] TSK-0007: Написать тесты для adapter (проверить, что возвращает старый формат)
655
+ - [ ] TSK-0008: Обновить `src/cli/runner.ts` — использовать adapter вместо прямого вызова `format()`
656
+ - [ ] TSK-0009: Прогнать CLI интеграционные тесты
657
+ - [ ] TSK-0010: Commit: "feat: add ErrorAdapter for CLI backward compatibility"
658
+
659
+ ✅ **Checkpoint:** CLI работает через adapter, готов к переходу на новый формат.
660
+
661
+ ---
662
+
663
+ ### Phase 3: Миграция внутренних потребителей
664
+
665
+ **Цель:** Обновить все внутренние вызовы на использование `formatJSON()`.
666
+
667
+ - [ ] TSK-0011: Обновить `src/api/client.ts:56` — использовать `formatJSON().message`
668
+ - [ ] TSK-0012: Обновить `src/api/retry.ts:89` — использовать `formatJSON().code`
669
+ - [ ] TSK-0013: Обновить `src/api/validator.ts:123` — использовать `formatJSON()`
670
+ - [ ] TSK-0014: ... (создать задачу для каждого из оставшихся 20 файлов)
671
+ - [ ] TSK-0035: Обновить unit-тесты для всех измененных файлов
672
+ - [ ] TSK-0036: Commit: "refactor: migrate internal consumers to formatJSON"
673
+
674
+ ✅ **Checkpoint:** Все внутренние вызовы используют новый формат.
675
+
676
+ ---
677
+
678
+ ### Phase 4: Deprecation старого API
679
+
680
+ **Цель:** Пометить старый метод `format()` как deprecated.
681
+
682
+ - [ ] TSK-0037: Добавить `@deprecated` JSDoc comment к `format()` методу
683
+ - [ ] TSK-0038: Добавить console.warn при вызове `format()` в dev mode
684
+ - [ ] TSK-0039: Обновить документацию — добавить migration guide
685
+ - [ ] TSK-0040: Обновить CHANGELOG.md — описать Breaking Change в следующей мажорной версии
686
+ - [ ] TSK-0041: Commit: "docs: deprecate ErrorHandler.format() in favor of formatJSON"
687
+
688
+ ✅ **Checkpoint:** Пользователи предупреждены о будущем Breaking Change.
689
+
690
+ ---
691
+
692
+ ### Phase 5: Финальная замена (Breaking Change)
693
+
694
+ **Цель:** Удалить старый API, сделать новый основным.
695
+
696
+ ⚠️ **Внимание:** Эта фаза выполняется только в новой мажорной версии (v2.0.0).
697
+
698
+ - [ ] TSK-0042: Переименовать `format()` → `formatLegacy()`
699
+ - [ ] TSK-0043: Переименовать `formatJSON()` → `format()`
700
+ - [ ] TSK-0044: Удалить `formatLegacy()` (или оставить приватным для adapter)
701
+ - [ ] TSK-0045: Обновить все тесты на использование нового `format()`
702
+ - [ ] TSK-0046: Обновить документацию — убрать упоминание старого формата
703
+ - [ ] TSK-0047: Прогнать полный набор тестов (unit + integration + e2e)
704
+ - [ ] TSK-0048: Commit: "BREAKING: change ErrorHandler.format() to return JSON"
705
+
706
+ ✅ **Checkpoint:** Миграция завершена, код чистый, тесты проходят.
707
+
708
+ ---
709
+
710
+ ### Phase 6: Финальная проверка
711
+
712
+ **Цель:** Убедиться, что все работает корректно.
713
+
714
+ - [ ] TSK-0049: Прогнать linter (`bun run lint`) — исправить ошибки
715
+ - [ ] TSK-0050: Прогнать formatter (`bun run format`) — отформатировать код
716
+ - [ ] TSK-0051: Прогнать все тесты (`bun run test`) — проверить 100% прохождение
717
+ - [ ] TSK-0052: Прогнать type checker (`bun run typecheck`) — проверить типы
718
+ - [ ] TSK-0053: Создать PR в master с описанием изменений
719
+ - [ ] TSK-0054: Code review — запросить ревью у команды
720
+ ````
721
+
722
+ **Важные правила для задач:**
723
+ 1. Каждая задача должна быть **атомарной** (одно действие, один файл или группа связанных файлов).
724
+ 2. После каждой фазы — **коммит**. Это позволяет откатиться на любую стабильную точку.
725
+ 3. Задачи упорядочены по **безопасности**: сначала добавляем новое, потом мигрируем, потом удаляем старое.
726
+ 4. **Checkpoints** после каждой фазы описывают критерии готовности.
727
+
728
+ ### Шаг 5.3: Добавление дополнительных разделов
729
+
730
+ Если применимо, добавь:
731
+
732
+ **Раздел: Риски и митигация (опционально, если есть критичные риски)**
733
+
734
+ ````markdown
735
+ ## Риски и митигация
736
+
737
+ | Риск | Вероятность | Влияние | Митигация |
738
+ |:-----|:------------|:--------|:----------|
739
+ | External plugins break | Высокая | Критическое | Deprecation path: v1.x warning, v2.0 breaking |
740
+ | Performance degradation | Средняя | Среднее | Benchmark before/after, optimize JSON.stringify usage |
741
+ | CLI tests fail | Низкая | Низкое | Smoke test CLI manually before commit |
742
+ ````
743
+
744
+ **Раздел: Rollback план (опционально, для критичных изменений)**
745
+
746
+ ````markdown
747
+ ## Rollback план
748
+
749
+ Если после внедрения что-то пошло не так:
750
+
751
+ 1. **Быстрый откат (без кода):**
752
+ - Feature flag: установить `USE_LEGACY_ERRORS=true` в env
753
+ - Restart services
754
+
755
+ 2. **Полный откат (через git):**
756
+ - `git revert <commit-hash>` на последний коммит Phase 5
757
+ - Откатиться к Phase 4 (deprecated API все еще работает)
758
+
759
+ 3. **Частичный откат (через adapter):**
760
+ - Вернуть вызов адаптера в проблемных местах
761
+ - Оставить новый API для новых мест
762
+ ````
763
+
764
+ ### Шаг 5.4: Сохранение файла
765
+
766
+ Создай файл в целевой директории:
767
+ - Single-project: `./.agentica/changes/CH-XXXX - <Название>.md`
768
+ - Monorepo: `./packages/<name>/.agentica/changes/CH-XXXX - <Название>.md`
769
+
770
+ ## Фаза 6: Git Workflow
771
+
772
+ ### Шаг 6.1: Проверка наличия Git
773
+
774
+ Проверь, инициализирован ли git репозиторий:
775
+
776
+ ```bash
777
+ git rev-parse --is-inside-work-tree 2>/dev/null
778
+ ```
779
+
780
+ Если git отсутствует — **пропусти эту фазу**, перейди к Фазе 7.
781
+
782
+ ### Шаг 6.2: Создание ветки
783
+
784
+ Создай новую ветку для изменения:
785
+
786
+ ```bash
787
+ git checkout -b change/CH-XXXX-краткое-описание
788
+ ```
789
+
790
+ Пример: `change/CH-0015-json-error-format`
791
+
792
+ **Правила именования:**
793
+ - Формат: `change/CH-XXXX-kebab-case-description`
794
+ - Максимум 50 символов
795
+ - Только латиница и дефисы
796
+
797
+ ### Шаг 6.3: Коммит спецификации
798
+
799
+ После создания спеки сделай первый коммит:
800
+
801
+ ```bash
802
+ git add .agentica/changes/CH-XXXX*.md
803
+ git commit -m "docs(CH-XXXX): create change specification for <краткое описание>"
804
+ ```
805
+
806
+ Пример:
807
+ ```bash
808
+ git commit -m "docs(CH-0015): create change specification for JSON error format"
809
+ ```
810
+
811
+ ### Шаг 6.4: Коммиты после каждой фазы
812
+
813
+ **Важно:** Коммиты делаются **только** на этапе `implement`, **не** на этапе `change`.
814
+
815
+ В спеке ты только **планируешь** коммиты, пиши их в задачах как:
816
+ - `TSK-0005: Commit: "feat: add ErrorResponse type and formatJSON method"`
817
+
818
+ Реальные коммиты будет делать `agentica.implement`.
819
+
820
+ ## Фаза 7: Финальная проверка
821
+
822
+ Перед завершением работы проверь:
823
+
824
+ ### Чеклист качества спецификации
825
+
826
+ - [ ] Номер CH-XXXX уникален (не конфликтует с существующими).
827
+ - [ ] Заголовок и описание заполнены конкретными данными (нет "XXX", "TODO").
828
+ - [ ] Раздел "Текущее поведение" содержит код-примеры и ссылки на файлы.
829
+ - [ ] Раздел "Ожидаемое поведение" содержит Golden Snippet.
830
+ - [ ] Раздел "Impact Analysis" перечисляет все Breaking Changes.
831
+ - [ ] Раздел "Задачи" разбит на фазы с checkpoints.
832
+ - [ ] Каждая задача атомарна (одно действие).
833
+ - [ ] После каждой фазы есть задача на коммит.
834
+ - [ ] Финальная фаза включает lint, format, tests.
835
+ - [ ] Если есть Breaking Changes — есть план миграции.
836
+ - [ ] Если есть критичные риски — есть rollback план.
837
+
838
+ Если хотя бы одна проверка провалена — **дополни спеку** перед завершением.
839
+
840
+ ## Фаза 8: Отчёт пользователю
841
+
842
+ Выдай короткое резюме.
843
+
844
+ Пример:
845
+
846
+ ```
847
+ ✅ Спецификация изменений создана: CH-0015 - Формат ошибок на JSON
848
+
849
+ 📋 Скоуп: Package: api-client
850
+
851
+ 🎯 Тип изменения: Breaking
852
+
853
+ 📄 Затронутые компоненты:
854
+ - ErrorHandler: изменение сигнатуры format() метода
855
+ - CLI module: добавление backward compatibility adapter
856
+ - 23 внутренних потребителя: обновление вызовов
857
+ - Тесты: переписать 15 unit-тестов
858
+
859
+ ⚠️ Breaking Changes:
860
+ - ErrorHandler.format() возвращает объект вместо строки
861
+ - External plugins могут сломаться (требуется migration guide)
862
+
863
+ 📊 Статистика:
864
+ - Файлов к изменению: 27
865
+ - Точек использования: 23
866
+ - Тестов требует обновления: 15
867
+
868
+ 🔀 Git:
869
+ - Ветка создана: change/CH-0015-json-error-format
870
+ - Спека закоммичена: a1b2c3d
871
+
872
+ ➡️ Следующий шаг:
873
+ Для начала реализации выполни:
874
+ `/agentica.implement --id CH-0015`
875
+ ```
876
+
877
+ ## Дополнительные правила
878
+
879
+ ### Работа с неопределённостью
880
+
881
+ Если пользователь говорит "сделай как лучше":
882
+ 1. Предложи **2-3 варианта** стратегии изменения.
883
+ 2. Для каждого укажи Trade-offs (что получаем, что теряем).
884
+ 3. Рекомендуй один вариант с обоснованием.
885
+ 4. Дай пользователю выбрать через интсрумент `ask_questions`.
886
+
887
+ ### Работа с конфликтами
888
+
889
+ Если изменение противоречит `tech.md` или существующим архитектурным решениям:
890
+ 1. Задокументируй конфликт в разделе "Риски".
891
+ 2. Предложи план согласования (создать `AR-XXXX` для изменения архитектуры).
892
+ 3. Укажи, можно ли реализовать изменение **без** нарушения стандартов (компромисс).
893
+
894
+ ### Работа с Cross-Package Changes
895
+
896
+ Если изменение затрагивает несколько пакетов:
897
+ 1. Создай спеку в **корневом** `.agentica/changes/` (не в пакете).
898
+ 2. В разделе "Impact Analysis" перечисли все затронутые пакеты.
899
+ 3. В задачах группируй изменения по пакетам:
900
+ ```
901
+ ### Phase 2: Update package-a
902
+ - [ ] TSK-0010: Update package-a/src/module.ts
903
+ - [ ] TSK-0011: ...
904
+
905
+ ### Phase 3: Update package-b
906
+ - [ ] TSK-0020: Update package-b/src/service.ts
907
+ - [ ] TSK-0021: ...
908
+ ```
909
+
910
+ ### Терминология и стиль
911
+
912
+ - Используй термины из `tech.md` проекта.
913
+ - Пиши кратко, но **точно**. Одно предложение лучше абзаца воды.
914
+ - Код-примеры должны быть **рабочими** или максимально близкими к реальности.
915
+ - Golden Snippet в разделе "Ожидаемое поведение" — обязателен для изменений API.