@mrciphersmith/keryx 0.2.98 → 0.2.100

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 (182) hide show
  1. package/dist/cli.js +4605 -2695
  2. package/dist/core.js +39 -1
  3. package/package.json +1 -1
  4. package/src/gdskills/bundled/rules/core/cli-interface-design.mdc +237 -0
  5. package/src/gdskills/bundled/rules/core/definition-of-done.mdc +116 -0
  6. package/src/gdskills/bundled/rules/core/skills-storage-workflow.mdc +101 -11
  7. package/src/gdskills/bundled/rules/core/subagent-status-protocol.md +9 -2
  8. package/src/gdskills/bundled/skills/core/reviewer-skill-creator/SKILL.md +42 -5
  9. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.md +19 -3
  10. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.md +20 -4
  11. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.md +32 -9
  12. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.md +18 -4
  13. package/src/gdskills/bundled/skills/orchestration/flow-orchestrator/SKILL.md +21 -5
  14. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.md +4 -4
  15. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/orchestrator-prompt.md +1 -1
  16. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.md +42 -2
  17. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.md +23 -9
  18. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.md +33 -31
  19. package/src/gdskills/bundled/skills/orchestration/task-implementer/output-contract.schema.json +32 -1
  20. package/src/gdskills/bundled/skills/planning/autodoc-analyst/SKILL.md +16 -0
  21. package/src/gdskills/bundled/skills/planning/autodoc-architect/SKILL.md +16 -0
  22. package/src/gdskills/bundled/skills/planning/autodoc-assembler/SKILL.md +16 -0
  23. package/src/gdskills/bundled/skills/planning/autodoc-orchestrator/SKILL.md +17 -0
  24. package/src/gdskills/bundled/skills/planning/autodoc-scanner/SKILL.md +16 -0
  25. package/src/gdskills/bundled/skills/planning/autodoc-writer/SKILL.md +16 -0
  26. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.md +28 -3
  27. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.codex.md +17 -0
  28. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.cursor.md +17 -0
  29. package/src/gdskills/bundled/skills/planning/consistency-checker/SKILL.md +17 -0
  30. package/src/gdskills/bundled/skills/planning/docpack-orchestrator/SKILL.md +32 -2
  31. package/src/gdskills/bundled/skills/planning/docpack-review/SKILL.md +14 -2
  32. package/src/gdskills/bundled/skills/planning/interview/SKILL.md +29 -7
  33. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.md +32 -6
  34. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.codex.md +16 -0
  35. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.cursor.md +16 -0
  36. package/src/gdskills/bundled/skills/planning/patterns-researcher/SKILL.md +16 -0
  37. package/src/gdskills/bundled/skills/planning/planner/SKILL.codex.md +17 -0
  38. package/src/gdskills/bundled/skills/planning/planner/SKILL.cursor.md +17 -0
  39. package/src/gdskills/bundled/skills/planning/planner/SKILL.md +17 -0
  40. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.md +20 -3
  41. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.codex.md +16 -0
  42. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.cursor.md +16 -0
  43. package/src/gdskills/bundled/skills/planning/problem-definer/SKILL.md +16 -0
  44. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.codex.md +16 -0
  45. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.cursor.md +16 -0
  46. package/src/gdskills/bundled/skills/planning/project-discovery/SKILL.md +16 -0
  47. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.codex.md +4 -0
  48. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.cursor.md +4 -0
  49. package/src/gdskills/bundled/skills/planning/spec-writer/SKILL.md +4 -0
  50. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.codex.md +4 -0
  51. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.cursor.md +4 -0
  52. package/src/gdskills/bundled/skills/planning/stack-advisor/SKILL.md +4 -0
  53. package/src/gdskills/bundled/skills/platform/agent-entrypoint-distiller/SKILL.md +31 -4
  54. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.md +26 -2
  55. package/src/gdskills/bundled/skills/platform/hookify/SKILL.md +28 -3
  56. package/src/gdskills/bundled/skills/quality/api-truth/SKILL.md +226 -0
  57. package/src/gdskills/bundled/skills/quality/changelog/SKILL.md +24 -4
  58. package/src/gdskills/bundled/skills/quality/commit/SKILL.md +24 -3
  59. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.md +24 -3
  60. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.md +25 -4
  61. package/src/gdskills/bundled/skills/quality/deploy/SKILL.md +26 -3
  62. package/src/gdskills/bundled/skills/quality/deprecation-path/SKILL.md +268 -0
  63. package/src/gdskills/bundled/skills/quality/fresh-eyes/SKILL.md +190 -0
  64. package/src/gdskills/bundled/skills/quality/metaproject-security/SKILL.md +24 -3
  65. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.md +29 -8
  66. package/src/gdskills/bundled/skills/quality/pr/SKILL.md +24 -4
  67. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.md +25 -2
  68. package/src/gdskills/bundled/skills/quality/push/SKILL.md +24 -3
  69. package/src/gdskills/bundled/skills/quality/root-cause/SKILL.md +204 -0
  70. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.md +25 -4
  71. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.md +24 -3
  72. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.md +17 -2
  73. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.md +40 -5
  74. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.md +41 -1
  75. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.md +44 -2
  76. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.md +44 -4
  77. package/src/gdskills/bundled/skills/review/review-architecture/SKILL.md +3 -3
  78. package/src/gdskills/bundled/skills/review/review-backend/SKILL.md +2 -3
  79. package/src/gdskills/bundled/skills/review/review-clean-code/SKILL.md +4 -4
  80. package/src/gdskills/bundled/skills/review/review-core-boundaries/SKILL.md +36 -2
  81. package/src/gdskills/bundled/skills/review/review-flow-graph/SKILL.md +37 -3
  82. package/src/gdskills/bundled/skills/review/review-frontend/SKILL.md +2 -4
  83. package/src/gdskills/bundled/skills/review/review-frontend-conventions/SKILL.md +36 -2
  84. package/src/gdskills/bundled/skills/review/review-highload/SKILL.md +3 -5
  85. package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +23 -2
  86. package/src/gdskills/bundled/skills/review/review-logic/SKILL.md +3 -3
  87. package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +9 -29
  88. package/src/gdskills/bundled/skills/review/review-performance/SKILL.md +9 -9
  89. package/src/gdskills/bundled/skills/review/review-pr-feedback/SKILL.md +3 -2
  90. package/src/gdskills/bundled/skills/review/review-regression/SKILL.md +33 -2
  91. package/src/gdskills/bundled/skills/review/review-security-code/SKILL.md +4 -2
  92. package/src/gdskills/bundled/skills/review/review-style/SKILL.md +2 -2
  93. package/src/gdskills/bundled/skills/review/review-testing-practices/SKILL.md +40 -2
  94. package/src/gdskills/bundled/skills/review/review-verifier/SKILL.md +1 -1
  95. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.codex.md +0 -330
  96. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.cursor.md +0 -330
  97. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.opencode.md +0 -330
  98. package/src/gdskills/bundled/skills/orchestration/code-verifier/SKILL.zed.md +0 -330
  99. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.codex.md +0 -655
  100. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.cursor.md +0 -655
  101. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.opencode.md +0 -655
  102. package/src/gdskills/bundled/skills/orchestration/context-collector/SKILL.zed.md +0 -655
  103. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.codex.md +0 -424
  104. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.cursor.md +0 -424
  105. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.opencode.md +0 -424
  106. package/src/gdskills/bundled/skills/orchestration/feature-analyzer/SKILL.zed.md +0 -424
  107. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.codex.md +0 -163
  108. package/src/gdskills/bundled/skills/orchestration/feature-dev/SKILL.cursor.md +0 -163
  109. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.codex.md +0 -373
  110. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.cursor.md +0 -373
  111. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.opencode.md +0 -373
  112. package/src/gdskills/bundled/skills/orchestration/issue-analyzer/SKILL.zed.md +0 -373
  113. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.codex.md +0 -374
  114. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.cursor.md +0 -374
  115. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.opencode.md +0 -374
  116. package/src/gdskills/bundled/skills/orchestration/job-documenter/SKILL.zed.md +0 -374
  117. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.codex.md +0 -2232
  118. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.cursor.md +0 -2232
  119. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.opencode.md +0 -2232
  120. package/src/gdskills/bundled/skills/orchestration/job-orchestrator/SKILL.zed.md +0 -2232
  121. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.codex.md +0 -668
  122. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.cursor.md +0 -668
  123. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.opencode.md +0 -668
  124. package/src/gdskills/bundled/skills/orchestration/task-implementer/SKILL.zed.md +0 -668
  125. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.codex.md +0 -90
  126. package/src/gdskills/bundled/skills/planning/brainstorm/SKILL.cursor.md +0 -90
  127. package/src/gdskills/bundled/skills/planning/interview/SKILL.codex.md +0 -187
  128. package/src/gdskills/bundled/skills/planning/interview/SKILL.cursor.md +0 -187
  129. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.codex.md +0 -105
  130. package/src/gdskills/bundled/skills/planning/interviewer/SKILL.cursor.md +0 -105
  131. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.codex.md +0 -193
  132. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.cursor.md +0 -193
  133. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.opencode.md +0 -193
  134. package/src/gdskills/bundled/skills/planning/prd-creator/SKILL.zed.md +0 -193
  135. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.codex.md +0 -87
  136. package/src/gdskills/bundled/skills/platform/claude-md-management/SKILL.cursor.md +0 -87
  137. package/src/gdskills/bundled/skills/platform/hookify/SKILL.codex.md +0 -100
  138. package/src/gdskills/bundled/skills/platform/hookify/SKILL.cursor.md +0 -100
  139. package/src/gdskills/bundled/skills/quality/changelog/SKILL.codex.md +0 -84
  140. package/src/gdskills/bundled/skills/quality/changelog/SKILL.cursor.md +0 -84
  141. package/src/gdskills/bundled/skills/quality/commit/SKILL.codex.md +0 -66
  142. package/src/gdskills/bundled/skills/quality/commit/SKILL.cursor.md +0 -66
  143. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.codex.md +0 -66
  144. package/src/gdskills/bundled/skills/quality/db-migrate/SKILL.cursor.md +0 -66
  145. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.codex.md +0 -81
  146. package/src/gdskills/bundled/skills/quality/dependency-update/SKILL.cursor.md +0 -81
  147. package/src/gdskills/bundled/skills/quality/deploy/SKILL.codex.md +0 -70
  148. package/src/gdskills/bundled/skills/quality/deploy/SKILL.cursor.md +0 -70
  149. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.codex.md +0 -83
  150. package/src/gdskills/bundled/skills/quality/perf-check/SKILL.cursor.md +0 -83
  151. package/src/gdskills/bundled/skills/quality/pr/SKILL.codex.md +0 -75
  152. package/src/gdskills/bundled/skills/quality/pr/SKILL.cursor.md +0 -75
  153. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.codex.md +0 -378
  154. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.cursor.md +0 -378
  155. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.opencode.md +0 -378
  156. package/src/gdskills/bundled/skills/quality/pr-issue-documenter/SKILL.zed.md +0 -378
  157. package/src/gdskills/bundled/skills/quality/push/SKILL.codex.md +0 -52
  158. package/src/gdskills/bundled/skills/quality/push/SKILL.cursor.md +0 -52
  159. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.codex.md +0 -108
  160. package/src/gdskills/bundled/skills/quality/security-audit/SKILL.cursor.md +0 -108
  161. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.codex.md +0 -80
  162. package/src/gdskills/bundled/skills/quality/test-gen/SKILL.cursor.md +0 -80
  163. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.codex.md +0 -345
  164. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.cursor.md +0 -345
  165. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.opencode.md +0 -345
  166. package/src/gdskills/bundled/skills/quality/tests-creator/SKILL.zed.md +0 -345
  167. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.codex.md +0 -203
  168. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.cursor.md +0 -203
  169. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.opencode.md +0 -203
  170. package/src/gdskills/bundled/skills/review/code-ai-review/SKILL.zed.md +0 -203
  171. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.codex.md +0 -243
  172. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.cursor.md +0 -243
  173. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.opencode.md +0 -243
  174. package/src/gdskills/bundled/skills/review/code-learned-review/SKILL.zed.md +0 -243
  175. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.codex.md +0 -259
  176. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.cursor.md +0 -259
  177. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.opencode.md +0 -259
  178. package/src/gdskills/bundled/skills/review/code-mobx-store-review/SKILL.zed.md +0 -259
  179. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.codex.md +0 -168
  180. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.cursor.md +0 -168
  181. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.opencode.md +0 -168
  182. package/src/gdskills/bundled/skills/review/code-style-review/SKILL.zed.md +0 -168
@@ -1,259 +0,0 @@
1
- ---
2
- name: code-mobx-store-review
3
- description: "Targeted MobX store and state logic review. Checks store/actions/computed/reactions, async runInAction, state typing, View↔Store boundaries. Use when: reviewing MobX changes, state management validation."
4
- triggers:
5
- - "Review MobX store"
6
- - "Check store changes"
7
- - "MobX review"
8
- metadata:
9
- author: "MrCipherSmith"
10
- version: "1.1.0"
11
- category: "review"
12
- compatible_harnesses: "cursor,codex,zed,opencode,claude"
13
- stack_requires: "mobx"
14
- license: "MIT"
15
- ---
16
-
17
- ---
18
-
19
- # Code MobX Store Review (только текущая ветка)
20
-
21
- Проводи ревью только изменений текущей ветки от merge-base с родительской веткой. Фокусируйся на корректности состояния, MobX-паттернах и границах архитектуры.
22
-
23
- ## Scope
24
-
25
- - Если пользователь **не передал commit hash/range**, ревьюируй полный срез от merge-base до рабочего дерева:
26
- - закоммиченные изменения (`BASE_SHA..HEAD`)
27
- - локальные (`staged/unstaged/untracked`)
28
- - Если пользователь **явно передал commit hash/range**, ревьюируй только его.
29
- - Не ревьюй легаси вне измененного скоупа.
30
- - Привязывай замечания к измененным строкам в diff.
31
-
32
- ## Scope Detection
33
-
34
- See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
35
-
36
- Run the script from that file to determine MERGE_BASE and SCOPE before proceeding with the review.
37
-
38
- ### Команды сбора изменений
39
-
40
- ```bash
41
- git status
42
- git log --oneline "${BASE_SHA}..HEAD"
43
- git diff --name-status --find-renames "${BASE_SHA}..HEAD"
44
- git diff --find-renames "${BASE_SHA}..HEAD"
45
- git diff --name-status --find-renames "${BASE_SHA}"
46
- git diff --find-renames "${BASE_SHA}"
47
- git ls-files --others --exclude-standard
48
- ```
49
-
50
- ## MobX review checklist
51
-
52
- ### Store structure
53
- - Store-класс должен иметь `makeObservable(this)` в конструкторе.
54
- - Состояние хранится в `@observable`/`@observable.shallow`/`@observable.ref`.
55
- - Производные значения в `@computed`, а не в View.
56
-
57
- ### Member ordering
58
- Проверяй порядок членов класса (соответствие `@typescript-eslint/member-ordering` и проектной конвенции):
59
- 1. `@observable` поля (публичное состояние, без модификатора)
60
- 2. `private` поля (внутреннее состояние: `disposed`, `initialized`, и т.д.)
61
- 3. `constructor`
62
- 4. `@computed` геттеры
63
- 5. `dispose()` — lifecycle очистки
64
- 6. `init()` / `onMount()` — lifecycle инициализации
65
- 7. `@action.bound` методы — UI-facing actions
66
- 8. `private` методы — API-вызовы и внутренняя логика
67
-
68
- ### Member accessibility modifiers
69
- ESLint: `@typescript-eslint/explicit-member-accessibility: ["error", { accessibility: "no-public" }]` — слово `public` **запрещено**.
70
-
71
- - *(без модификатора)*: `@observable` поля, `@computed` геттеры, `@action.bound` методы, `dispose()`, `init()` — публичный API стора.
72
- - `private`: внутреннее состояние (`disposed`, `initialized`), хелпер-методы, методы с API-вызовами (`fetchX`, `performX`), inter-store callbacks (`onChangeX`, `onFireX`, `handleX`, `syncX`).
73
- - `private readonly`: инжектированные через конструктор зависимости, неизменяемая конфигурация (`id`, `context`).
74
- - `readonly`: неизменяемые публичные identity-поля (`pipelineType`, `contextActions`).
75
- - `protected`: только в абстрактных базовых классах для точек расширения.
76
-
77
- Флаги ревью:
78
- - Использование слова `public` — **ошибка ESLint** (error level).
79
- - `private` поле которое можно сделать `private readonly` — предложи `readonly`.
80
- - Отсутствие `private` на внутреннем состоянии или хелпер-методах — **warning**.
81
-
82
- ### Actions and async
83
- - Любая мутация состояния в действиях (`@action.bound` или через `runInAction`).
84
- - После `await` для мутаций использовать `runInAction`.
85
- - Избегать прямых мутаций store извне action-слоя.
86
-
87
- ### Action binding rules
88
- - **`@action.bound`**: только для методов вызываемых из UI (компонентов). Это тонкие обёртки которые делегируют в private-методы.
89
- - **Private метод + `runInAction`**: для методов содержащих API-вызовы и мутации состояния.
90
- - **Никогда** не использовать `@action.bound` на private-методах.
91
- - **Исключение**: `@action.bound private` допустим для inter-store callbacks — методов, передаваемых как bound-ссылки в дочерние/сиблинг сторы (например `new CodeEditorStore(this.onChangeEditorState)`).
92
-
93
- Флаги ревью:
94
- - `@action.bound` метод содержит API-вызов напрямую — **warning**: вынести API в private метод.
95
- - `@action.bound` на private методе (кроме inter-store callbacks) — **warning**: убрать декоратор, использовать `runInAction` внутри.
96
- - Метод вызываемый из другого стора помечен `@action.bound` вместо plain method — **suggestion**.
97
-
98
- ### Inter-store callbacks and internal handlers
99
- Методы служащие **внутренними callback'ами** между сторами или внутренними обработчиками событий ОБЯЗАНЫ быть `private`. Они НЕ являются частью публичного API стора.
100
-
101
- **Паттерны имён которые ОБЯЗАНЫ быть `private`:**
102
- - `onChangeEditorState(state)` — callback получающий состояние от дочернего/сиблинг стора
103
- - `onFireExecutorChange()` — внутренний sync-обработчик при смене executor
104
- - `onChangeX(value)` — обработчик для внутренней синхронизации состояния между сторами
105
- - `handleX()`, `syncX()` — любой метод внутренней координации
106
-
107
- **Правило решения:** Спроси "Этот метод вызывается из React-компонента через JSX/event handler?" Если НЕТ — он `private`.
108
-
109
- Флаги ревью:
110
- - Публичный метод с паттерном `onChangeX`, `onFireX`, `handleX`, `syncX` который не вызывается из компонентов — **warning**: сделать `private`.
111
- - Inter-store callback без `private` — **warning**: нарушение инкапсуляции стора.
112
-
113
- ### Bidirectional sync bounce protection
114
- Когда два стора синхронизируют состояние **в обоих направлениях** (Store A → Store B и Store B → Store A), как минимум одно направление ОБЯЗАНО иметь equality guard (`if (newValue !== currentValue)`) перед записью в другой стор, чтобы предотвратить бесконечный цикл callback'ов.
115
-
116
- ```typescript
117
- // CORRECT — equality guard prevents bounce
118
- private onChangeEditorState(editorState: ICodeEditorState) {
119
- this.setRawScript(editorState.script);
120
- const codeExecutorId = this.codeExecutor?.id;
121
- if (codeExecutorId && this.codeEditorStore.executorId !== codeExecutorId) {
122
- this.codeEditorStore.setExecutorId(codeExecutorId);
123
- }
124
- }
125
-
126
- // WRONG — no guard, infinite loop
127
- private onChangeEditorState(editorState: ICodeEditorState) {
128
- this.setRawScript(editorState.script);
129
- const codeExecutorId = this.codeExecutor?.id;
130
- if (codeExecutorId) {
131
- this.codeEditorStore.setExecutorId(codeExecutorId); // bounces back
132
- }
133
- }
134
- ```
135
-
136
- Флаги ревью:
137
- - Bidirectional store sync без equality guard — **critical**: риск бесконечного цикла callback'ов.
138
- - Store A пишет в Store B в callback'е от Store B без проверки `!==` — **critical**.
139
-
140
- ### Truthy vs equality guards for optional values
141
- Для guard'ов обновления состояния предпочитай **equality comparison** (`!==`) вместо **truthy checks** (`if (value && ...)`) для optional/nullable полей. Truthy guard блокирует пропагацию легитимных `undefined`/`null`/`0`/`""` значений.
142
-
143
- ```typescript
144
- // WRONG — truthy guard blocks clearing
145
- if (executor && executor.id !== this.executorId) {
146
- this.setExecutorId(executor.id);
147
- }
148
- // executor = undefined → ничего не происходит → stale value
149
-
150
- // CORRECT — equality guard allows clearing
151
- if (executor?.id !== this.executorId) {
152
- this.setExecutorId(executor?.id);
153
- }
154
- // executor = undefined → executorId = undefined → поле очищено
155
- ```
156
-
157
- Флаги ревью:
158
- - Truthy guard (`if (x && x !== y)`) на optional/nullable поле — **warning**: блокирует пропагацию `undefined`/falsy clearing.
159
- - `if (value)` вместо `if (value !== currentValue)` в sync-логике между сторами — **warning**: потенциально блокирует clearing.
160
-
161
- ### API calls placement
162
- - API/IO вызовы **только** в `private` методах стора.
163
- - `@action.bound` методы — тонкие: guard-check → делегирование в private метод.
164
- - Компоненты **никогда** не вызывают API напрямую.
165
-
166
- Флаги ревью:
167
- - API-вызов внутри `@action.bound` метода — **warning**: вынести в private метод.
168
- - API-вызов в компоненте — **critical**: перенести в стор.
169
-
170
- ### Lifecycle initialization
171
- - `init()` / `onMount()` дочернего стора вызывается из **родительского стора**, не из component `useEffect`.
172
- - Компоненты **не должны** триггерить загрузку данных стора через `useEffect`. Родительский стор оркестрирует lifecycle дочерних сторов.
173
- - `dispose()` вызывается родительским стором в его `onUnmount()` для предотвращения stale-state обновлений.
174
-
175
- Флаги ревью:
176
- - Component `useEffect` вызывает `store.loadX()` или `store.init()` — **warning**: перенести вызов в родительский стор `onMount`.
177
- - Отсутствие `dispose()` / disposed guard в сторе с async операциями — **warning**.
178
- - Parent store не вызывает `child.dispose()` в `onUnmount()` — **warning**.
179
-
180
- ### View ↔ Store boundaries
181
- - Бизнес-логика и IO остаются в Store/Service, не во View.
182
- - Компоненты, читающие observable, должны быть `observer(...)`.
183
- - `useEffect` не должен подменять lifecycle store-логики.
184
-
185
- ### TypeScript safety
186
- - Не использовать `any` и небезопасные касты.
187
- - Использовать явные интерфейсы для state и публичного API store.
188
- - Избегать `!` без строгого доказательства инициализации.
189
-
190
- ## Output format
191
-
192
- ```markdown
193
- ## Summary
194
- - [1-3 bullets по итогам]
195
-
196
- ## Scope
197
- - Branch: `<BRANCH>`
198
- - Parent ref: `<PARENT>`
199
- - Merge-base: `<BASE_SHA>`
200
- - Scope mode: `<default-with-uncommitted | explicit-hash-range>`
201
-
202
- ## Critical issues (must fix)
203
- ### [Короткий заголовок]
204
- - **Rule**: [core/mobx-store-template.mdc / core/code-style-patterns.mdc]
205
- - **Why**: [почему это риск]
206
- - **Where**: `path/to/file.ts` (строки из diff)
207
- - **Fix**: [минимальное исправление]
208
- - **Proposed patch**:
209
- ```diff
210
- [unified diff]
211
- ```
212
-
213
- ## Warnings
214
- [тот же формат]
215
-
216
- ## Suggestions
217
- [точечные улучшения без расширения scope]
218
-
219
- ## File-by-file notes
220
- - `path/to/file`: [краткие заметки]
221
- ```
222
-
223
- ## Rules of engagement
224
-
225
- - Не предлагай новые библиотеки без запроса.
226
- - Если есть несколько вариантов, дай один default и один краткий альтернативный.
227
- - Исправления предлагай как минимальные патчи, не переписывай крупные блоки без необходимости.
228
-
229
- ---
230
-
231
- ## Scope Boundaries
232
-
233
- This skill covers **MobX store and state logic** — targeted review of store internals following `mobx-store-template.mdc` and `code-style-patterns.mdc`.
234
-
235
- | Concern | This skill | Use instead |
236
- |---------|-----------|-------------|
237
- | Store structure, actions, computed, reactions, async runInAction | ✅ YES | — |
238
- | View↔Store boundary violations | ✅ YES | — |
239
- | General code quality, readability, tests | ❌ NO | `code-ai-review` |
240
- | Learned-convention enforcement | ❌ NO | `code-learned-review` |
241
- | Naming/style/architecture patterns outside stores | ❌ NO | `code-style-review` |
242
-
243
- ---
244
-
245
- ## Job Context Awareness
246
-
247
- When dispatched by `job-orchestrator` as part of a job pipeline, the prompt MAY include:
248
-
249
- ```
250
- JOB_NAME: <job-name>
251
- CONTEXT_PATH: .metaproject/jobs/<job-name>/ai/context.md
252
- ```
253
-
254
- If provided and the file exists, read the context document before starting the review. Use it to:
255
- - Understand which libraries and patterns were intentionally chosen for the implementation
256
- - Validate MobX patterns against documented project conventions
257
- - Avoid flagging intentional architectural decisions as issues
258
-
259
- If the file does not exist or is not provided, proceed normally — context is optional and non-blocking.
@@ -1,259 +0,0 @@
1
- ---
2
- name: code-mobx-store-review
3
- description: "Targeted MobX store and state logic review. Checks store/actions/computed/reactions, async runInAction, state typing, View↔Store boundaries. Use when: reviewing MobX changes, state management validation."
4
- triggers:
5
- - "Review MobX store"
6
- - "Check store changes"
7
- - "MobX review"
8
- metadata:
9
- author: "MrCipherSmith"
10
- version: "1.1.0"
11
- category: "review"
12
- compatible_harnesses: "cursor,codex,zed,opencode,claude"
13
- stack_requires: "mobx"
14
- license: "MIT"
15
- ---
16
-
17
- ---
18
-
19
- # Code MobX Store Review (только текущая ветка)
20
-
21
- Проводи ревью только изменений текущей ветки от merge-base с родительской веткой. Фокусируйся на корректности состояния, MobX-паттернах и границах архитектуры.
22
-
23
- ## Scope
24
-
25
- - Если пользователь **не передал commit hash/range**, ревьюируй полный срез от merge-base до рабочего дерева:
26
- - закоммиченные изменения (`BASE_SHA..HEAD`)
27
- - локальные (`staged/unstaged/untracked`)
28
- - Если пользователь **явно передал commit hash/range**, ревьюируй только его.
29
- - Не ревьюй легаси вне измененного скоупа.
30
- - Привязывай замечания к измененным строкам в diff.
31
-
32
- ## Scope Detection
33
-
34
- See shared script: `.metaproject/skills/gdskills/shared/git-merge-base.md`
35
-
36
- Run the script from that file to determine MERGE_BASE and SCOPE before proceeding with the review.
37
-
38
- ### Команды сбора изменений
39
-
40
- ```bash
41
- git status
42
- git log --oneline "${BASE_SHA}..HEAD"
43
- git diff --name-status --find-renames "${BASE_SHA}..HEAD"
44
- git diff --find-renames "${BASE_SHA}..HEAD"
45
- git diff --name-status --find-renames "${BASE_SHA}"
46
- git diff --find-renames "${BASE_SHA}"
47
- git ls-files --others --exclude-standard
48
- ```
49
-
50
- ## MobX review checklist
51
-
52
- ### Store structure
53
- - Store-класс должен иметь `makeObservable(this)` в конструкторе.
54
- - Состояние хранится в `@observable`/`@observable.shallow`/`@observable.ref`.
55
- - Производные значения в `@computed`, а не в View.
56
-
57
- ### Member ordering
58
- Проверяй порядок членов класса (соответствие `@typescript-eslint/member-ordering` и проектной конвенции):
59
- 1. `@observable` поля (публичное состояние, без модификатора)
60
- 2. `private` поля (внутреннее состояние: `disposed`, `initialized`, и т.д.)
61
- 3. `constructor`
62
- 4. `@computed` геттеры
63
- 5. `dispose()` — lifecycle очистки
64
- 6. `init()` / `onMount()` — lifecycle инициализации
65
- 7. `@action.bound` методы — UI-facing actions
66
- 8. `private` методы — API-вызовы и внутренняя логика
67
-
68
- ### Member accessibility modifiers
69
- ESLint: `@typescript-eslint/explicit-member-accessibility: ["error", { accessibility: "no-public" }]` — слово `public` **запрещено**.
70
-
71
- - *(без модификатора)*: `@observable` поля, `@computed` геттеры, `@action.bound` методы, `dispose()`, `init()` — публичный API стора.
72
- - `private`: внутреннее состояние (`disposed`, `initialized`), хелпер-методы, методы с API-вызовами (`fetchX`, `performX`), inter-store callbacks (`onChangeX`, `onFireX`, `handleX`, `syncX`).
73
- - `private readonly`: инжектированные через конструктор зависимости, неизменяемая конфигурация (`id`, `context`).
74
- - `readonly`: неизменяемые публичные identity-поля (`pipelineType`, `contextActions`).
75
- - `protected`: только в абстрактных базовых классах для точек расширения.
76
-
77
- Флаги ревью:
78
- - Использование слова `public` — **ошибка ESLint** (error level).
79
- - `private` поле которое можно сделать `private readonly` — предложи `readonly`.
80
- - Отсутствие `private` на внутреннем состоянии или хелпер-методах — **warning**.
81
-
82
- ### Actions and async
83
- - Любая мутация состояния в действиях (`@action.bound` или через `runInAction`).
84
- - После `await` для мутаций использовать `runInAction`.
85
- - Избегать прямых мутаций store извне action-слоя.
86
-
87
- ### Action binding rules
88
- - **`@action.bound`**: только для методов вызываемых из UI (компонентов). Это тонкие обёртки которые делегируют в private-методы.
89
- - **Private метод + `runInAction`**: для методов содержащих API-вызовы и мутации состояния.
90
- - **Никогда** не использовать `@action.bound` на private-методах.
91
- - **Исключение**: `@action.bound private` допустим для inter-store callbacks — методов, передаваемых как bound-ссылки в дочерние/сиблинг сторы (например `new CodeEditorStore(this.onChangeEditorState)`).
92
-
93
- Флаги ревью:
94
- - `@action.bound` метод содержит API-вызов напрямую — **warning**: вынести API в private метод.
95
- - `@action.bound` на private методе (кроме inter-store callbacks) — **warning**: убрать декоратор, использовать `runInAction` внутри.
96
- - Метод вызываемый из другого стора помечен `@action.bound` вместо plain method — **suggestion**.
97
-
98
- ### Inter-store callbacks and internal handlers
99
- Методы служащие **внутренними callback'ами** между сторами или внутренними обработчиками событий ОБЯЗАНЫ быть `private`. Они НЕ являются частью публичного API стора.
100
-
101
- **Паттерны имён которые ОБЯЗАНЫ быть `private`:**
102
- - `onChangeEditorState(state)` — callback получающий состояние от дочернего/сиблинг стора
103
- - `onFireExecutorChange()` — внутренний sync-обработчик при смене executor
104
- - `onChangeX(value)` — обработчик для внутренней синхронизации состояния между сторами
105
- - `handleX()`, `syncX()` — любой метод внутренней координации
106
-
107
- **Правило решения:** Спроси "Этот метод вызывается из React-компонента через JSX/event handler?" Если НЕТ — он `private`.
108
-
109
- Флаги ревью:
110
- - Публичный метод с паттерном `onChangeX`, `onFireX`, `handleX`, `syncX` который не вызывается из компонентов — **warning**: сделать `private`.
111
- - Inter-store callback без `private` — **warning**: нарушение инкапсуляции стора.
112
-
113
- ### Bidirectional sync bounce protection
114
- Когда два стора синхронизируют состояние **в обоих направлениях** (Store A → Store B и Store B → Store A), как минимум одно направление ОБЯЗАНО иметь equality guard (`if (newValue !== currentValue)`) перед записью в другой стор, чтобы предотвратить бесконечный цикл callback'ов.
115
-
116
- ```typescript
117
- // CORRECT — equality guard prevents bounce
118
- private onChangeEditorState(editorState: ICodeEditorState) {
119
- this.setRawScript(editorState.script);
120
- const codeExecutorId = this.codeExecutor?.id;
121
- if (codeExecutorId && this.codeEditorStore.executorId !== codeExecutorId) {
122
- this.codeEditorStore.setExecutorId(codeExecutorId);
123
- }
124
- }
125
-
126
- // WRONG — no guard, infinite loop
127
- private onChangeEditorState(editorState: ICodeEditorState) {
128
- this.setRawScript(editorState.script);
129
- const codeExecutorId = this.codeExecutor?.id;
130
- if (codeExecutorId) {
131
- this.codeEditorStore.setExecutorId(codeExecutorId); // bounces back
132
- }
133
- }
134
- ```
135
-
136
- Флаги ревью:
137
- - Bidirectional store sync без equality guard — **critical**: риск бесконечного цикла callback'ов.
138
- - Store A пишет в Store B в callback'е от Store B без проверки `!==` — **critical**.
139
-
140
- ### Truthy vs equality guards for optional values
141
- Для guard'ов обновления состояния предпочитай **equality comparison** (`!==`) вместо **truthy checks** (`if (value && ...)`) для optional/nullable полей. Truthy guard блокирует пропагацию легитимных `undefined`/`null`/`0`/`""` значений.
142
-
143
- ```typescript
144
- // WRONG — truthy guard blocks clearing
145
- if (executor && executor.id !== this.executorId) {
146
- this.setExecutorId(executor.id);
147
- }
148
- // executor = undefined → ничего не происходит → stale value
149
-
150
- // CORRECT — equality guard allows clearing
151
- if (executor?.id !== this.executorId) {
152
- this.setExecutorId(executor?.id);
153
- }
154
- // executor = undefined → executorId = undefined → поле очищено
155
- ```
156
-
157
- Флаги ревью:
158
- - Truthy guard (`if (x && x !== y)`) на optional/nullable поле — **warning**: блокирует пропагацию `undefined`/falsy clearing.
159
- - `if (value)` вместо `if (value !== currentValue)` в sync-логике между сторами — **warning**: потенциально блокирует clearing.
160
-
161
- ### API calls placement
162
- - API/IO вызовы **только** в `private` методах стора.
163
- - `@action.bound` методы — тонкие: guard-check → делегирование в private метод.
164
- - Компоненты **никогда** не вызывают API напрямую.
165
-
166
- Флаги ревью:
167
- - API-вызов внутри `@action.bound` метода — **warning**: вынести в private метод.
168
- - API-вызов в компоненте — **critical**: перенести в стор.
169
-
170
- ### Lifecycle initialization
171
- - `init()` / `onMount()` дочернего стора вызывается из **родительского стора**, не из component `useEffect`.
172
- - Компоненты **не должны** триггерить загрузку данных стора через `useEffect`. Родительский стор оркестрирует lifecycle дочерних сторов.
173
- - `dispose()` вызывается родительским стором в его `onUnmount()` для предотвращения stale-state обновлений.
174
-
175
- Флаги ревью:
176
- - Component `useEffect` вызывает `store.loadX()` или `store.init()` — **warning**: перенести вызов в родительский стор `onMount`.
177
- - Отсутствие `dispose()` / disposed guard в сторе с async операциями — **warning**.
178
- - Parent store не вызывает `child.dispose()` в `onUnmount()` — **warning**.
179
-
180
- ### View ↔ Store boundaries
181
- - Бизнес-логика и IO остаются в Store/Service, не во View.
182
- - Компоненты, читающие observable, должны быть `observer(...)`.
183
- - `useEffect` не должен подменять lifecycle store-логики.
184
-
185
- ### TypeScript safety
186
- - Не использовать `any` и небезопасные касты.
187
- - Использовать явные интерфейсы для state и публичного API store.
188
- - Избегать `!` без строгого доказательства инициализации.
189
-
190
- ## Output format
191
-
192
- ```markdown
193
- ## Summary
194
- - [1-3 bullets по итогам]
195
-
196
- ## Scope
197
- - Branch: `<BRANCH>`
198
- - Parent ref: `<PARENT>`
199
- - Merge-base: `<BASE_SHA>`
200
- - Scope mode: `<default-with-uncommitted | explicit-hash-range>`
201
-
202
- ## Critical issues (must fix)
203
- ### [Короткий заголовок]
204
- - **Rule**: [core/mobx-store-template.mdc / core/code-style-patterns.mdc]
205
- - **Why**: [почему это риск]
206
- - **Where**: `path/to/file.ts` (строки из diff)
207
- - **Fix**: [минимальное исправление]
208
- - **Proposed patch**:
209
- ```diff
210
- [unified diff]
211
- ```
212
-
213
- ## Warnings
214
- [тот же формат]
215
-
216
- ## Suggestions
217
- [точечные улучшения без расширения scope]
218
-
219
- ## File-by-file notes
220
- - `path/to/file`: [краткие заметки]
221
- ```
222
-
223
- ## Rules of engagement
224
-
225
- - Не предлагай новые библиотеки без запроса.
226
- - Если есть несколько вариантов, дай один default и один краткий альтернативный.
227
- - Исправления предлагай как минимальные патчи, не переписывай крупные блоки без необходимости.
228
-
229
- ---
230
-
231
- ## Scope Boundaries
232
-
233
- This skill covers **MobX store and state logic** — targeted review of store internals following `mobx-store-template.mdc` and `code-style-patterns.mdc`.
234
-
235
- | Concern | This skill | Use instead |
236
- |---------|-----------|-------------|
237
- | Store structure, actions, computed, reactions, async runInAction | ✅ YES | — |
238
- | View↔Store boundary violations | ✅ YES | — |
239
- | General code quality, readability, tests | ❌ NO | `code-ai-review` |
240
- | Learned-convention enforcement | ❌ NO | `code-learned-review` |
241
- | Naming/style/architecture patterns outside stores | ❌ NO | `code-style-review` |
242
-
243
- ---
244
-
245
- ## Job Context Awareness
246
-
247
- When dispatched by `job-orchestrator` as part of a job pipeline, the prompt MAY include:
248
-
249
- ```
250
- JOB_NAME: <job-name>
251
- CONTEXT_PATH: .metaproject/jobs/<job-name>/ai/context.md
252
- ```
253
-
254
- If provided and the file exists, read the context document before starting the review. Use it to:
255
- - Understand which libraries and patterns were intentionally chosen for the implementation
256
- - Validate MobX patterns against documented project conventions
257
- - Avoid flagging intentional architectural decisions as issues
258
-
259
- If the file does not exist or is not provided, proceed normally — context is optional and non-blocking.