@nitra/cursor 1.9.21 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/.claude-template/hooks/capture-decisions.sh +3 -3
  2. package/.claude-template/hooks/normalize-decisions.sh +370 -0
  3. package/CHANGELOG.md +43 -0
  4. package/bin/n-cursor.js +56 -49
  5. package/package.json +10 -5
  6. package/rules/abie/auto.md +1 -0
  7. package/{scripts/check-abie.mjs → rules/abie/js/check.mjs} +5 -5
  8. package/rules/adr/adr.mdc +150 -0
  9. package/{scripts/check-adr.mjs → rules/adr/js/check.mjs} +85 -41
  10. package/rules/adr/policy/settings_json/settings_json.rego +37 -0
  11. package/rules/adr/policy/settings_local_json/settings_local_json.rego +40 -0
  12. package/rules/bun/auto.md +1 -0
  13. package/{scripts/check-bun.mjs → rules/bun/js/check.mjs} +1 -1
  14. package/rules/capacitor/auto.md +1 -0
  15. package/{scripts/check-capacitor.mjs → rules/capacitor/js/check.mjs} +1 -1
  16. package/rules/changelog/auto.md +1 -0
  17. package/{scripts/check-changelog.mjs → rules/changelog/js/check.mjs} +2 -2
  18. package/rules/docker/auto.md +1 -0
  19. package/{scripts/check-docker.mjs → rules/docker/js/check.mjs} +5 -5
  20. package/{scripts/run-docker.mjs → rules/docker/js/run.mjs} +5 -5
  21. package/rules/ga/auto.md +1 -0
  22. package/{scripts/check-ga.mjs → rules/ga/js/check.mjs} +4 -4
  23. package/{scripts/lint-ga.mjs → rules/ga/js/lint.mjs} +2 -2
  24. package/rules/graphql/auto.md +1 -0
  25. package/{scripts/check-graphql.mjs → rules/graphql/js/check.mjs} +5 -5
  26. package/rules/hasura/auto.md +1 -0
  27. package/{scripts/check-hasura.mjs → rules/hasura/js/check.mjs} +4 -4
  28. package/rules/image-avif/auto.md +1 -0
  29. package/{scripts/check-image-avif.mjs → rules/image-avif/js/check.mjs} +5 -5
  30. package/rules/image-compress/auto.md +1 -0
  31. package/{scripts/check-image-compress.mjs → rules/image-compress/js/check.mjs} +1 -1
  32. package/rules/js-bun-db/auto.md +1 -0
  33. package/{scripts/check-js-bun-db.mjs → rules/js-bun-db/js/check.mjs} +5 -5
  34. package/rules/js-bun-redis/auto.md +1 -0
  35. package/{scripts/check-js-bun-redis.mjs → rules/js-bun-redis/js/check.mjs} +4 -4
  36. package/rules/js-lint/auto.md +1 -0
  37. package/{scripts/check-js-lint.mjs → rules/js-lint/js/check.mjs} +1 -1
  38. package/rules/js-mssql/auto.md +1 -0
  39. package/{scripts/check-js-mssql.mjs → rules/js-mssql/js/check.mjs} +5 -5
  40. package/rules/js-run/auto.md +1 -0
  41. package/{scripts/check-js-run.mjs → rules/js-run/js/check.mjs} +11 -11
  42. package/rules/k8s/auto.md +1 -0
  43. package/{scripts/check-k8s.mjs → rules/k8s/js/check.mjs} +4 -4
  44. package/{scripts/run-k8s.mjs → rules/k8s/js/run.mjs} +4 -4
  45. package/rules/nginx-default-tpl/auto.md +1 -0
  46. package/{scripts/check-nginx-default-tpl.mjs → rules/nginx-default-tpl/js/check.mjs} +7 -7
  47. package/rules/npm-module/auto.md +1 -0
  48. package/{scripts/check-npm-module.mjs → rules/npm-module/js/check.mjs} +4 -4
  49. package/rules/php/auto.md +1 -0
  50. package/{scripts/check-php.mjs → rules/php/js/check.mjs} +1 -1
  51. package/{scripts/run-php.mjs → rules/php/js/run.mjs} +3 -3
  52. package/rules/rego/auto.md +1 -0
  53. package/{scripts/check-rego.mjs → rules/rego/js/check.mjs} +4 -4
  54. package/{scripts/lint-rego.mjs → rules/rego/js/lint.mjs} +1 -1
  55. package/rules/style-lint/auto.md +1 -0
  56. package/{scripts/check-style-lint.mjs → rules/style-lint/js/check.mjs} +1 -1
  57. package/rules/tauri/auto.md +1 -0
  58. package/{scripts/check-tauri.mjs → rules/tauri/js/check.mjs} +2 -2
  59. package/rules/text/auto.md +1 -0
  60. package/{scripts/check-text.mjs → rules/text/js/check.mjs} +2 -2
  61. package/{scripts/run-shellcheck-text.mjs → rules/text/js/run-shellcheck.mjs} +2 -2
  62. package/{scripts → rules/text/js}/run-v8r.mjs +2 -2
  63. package/{mdc → rules/text}/text.mdc +4 -0
  64. package/rules/vue/auto.md +1 -0
  65. package/{scripts/check-vue.mjs → rules/vue/js/check.mjs} +5 -5
  66. package/scripts/auto-rules.mjs +5 -5
  67. package/scripts/auto-skills.mjs +8 -6
  68. package/scripts/lint-conftest.mjs +13 -13
  69. package/scripts/sync-claude-config.mjs +70 -14
  70. package/scripts/utils/run-conftest-batch.mjs +9 -4
  71. package/skills/abie-clean/auto.md +1 -0
  72. package/skills/abie-kustomize/auto.md +1 -0
  73. package/skills/adr-normalize/SKILL.md +71 -0
  74. package/skills/adr-normalize/auto.md +1 -0
  75. package/skills/fix/auto.md +1 -0
  76. package/skills/lint/auto.md +1 -0
  77. package/skills/llm-patch/auto.md +1 -0
  78. package/skills/publish-telegram/auto.md +1 -0
  79. package/skills/taze/auto.md +1 -0
  80. package/bin/auto-rules.md +0 -59
  81. package/bin/auto-skills.md +0 -25
  82. package/mdc/adr.mdc +0 -86
  83. package/policy/adr/settings_json/settings_json.rego +0 -31
  84. package/policy/adr/settings_local_json/settings_local_json.rego +0 -28
  85. /package/{mdc → rules/abie}/abie.mdc +0 -0
  86. /package/{policy/abie → rules/abie/policy}/base_deployment_preem/base_deployment_preem.rego +0 -0
  87. /package/{policy/abie → rules/abie/policy}/base_deployment_preem/base_deployment_preem_test.rego +0 -0
  88. /package/{policy/abie → rules/abie/policy}/clean_merged_ignore_branches/clean_merged_ignore_branches.rego +0 -0
  89. /package/{policy/abie → rules/abie/policy}/clean_merged_ignore_branches/clean_merged_ignore_branches_test.rego +0 -0
  90. /package/{policy/abie → rules/abie/policy}/health_check_policy/health_check_policy.rego +0 -0
  91. /package/{policy/abie → rules/abie/policy}/health_check_policy/health_check_policy_test.rego +0 -0
  92. /package/{policy/abie → rules/abie/policy}/http_route_base/http_route_base.rego +0 -0
  93. /package/{policy/abie → rules/abie/policy}/http_route_base/http_route_base_test.rego +0 -0
  94. /package/{mdc → rules/bun}/bun.mdc +0 -0
  95. /package/{policy/bun → rules/bun/policy}/bunfig/bunfig.rego +0 -0
  96. /package/{policy/bun → rules/bun/policy}/package_json/package_json.rego +0 -0
  97. /package/{policy/bun → rules/bun/policy}/package_json/package_json_test.rego +0 -0
  98. /package/{mdc → rules/capacitor}/capacitor.mdc +0 -0
  99. /package/{policy/capacitor → rules/capacitor/policy}/package_json/package_json.rego +0 -0
  100. /package/{mdc → rules/changelog}/changelog.mdc +0 -0
  101. /package/{mdc → rules/ci4}/ci4.mdc +0 -0
  102. /package/{mdc → rules/docker}/docker.mdc +0 -0
  103. /package/{policy/docker → rules/docker/policy}/lint_docker_yml/lint_docker_yml.rego +0 -0
  104. /package/{policy/docker → rules/docker/policy}/lint_docker_yml/lint_docker_yml_test.rego +0 -0
  105. /package/{policy/docker → rules/docker/policy}/package_json/package_json.rego +0 -0
  106. /package/{policy/docker → rules/docker/policy}/package_json/package_json_test.rego +0 -0
  107. /package/{mdc → rules/ga}/ga.mdc +0 -0
  108. /package/{policy/ga → rules/ga/policy}/clean_ga_workflows/clean_ga_workflows.rego +0 -0
  109. /package/{policy/ga → rules/ga/policy}/clean_merged_branch/clean_merged_branch.rego +0 -0
  110. /package/{policy/ga → rules/ga/policy}/git_ai/git_ai.rego +0 -0
  111. /package/{policy/ga → rules/ga/policy}/lint_ga/lint_ga.rego +0 -0
  112. /package/{policy/ga → rules/ga/policy}/workflow_common/workflow_common.rego +0 -0
  113. /package/{mdc → rules/graphql}/graphql.mdc +0 -0
  114. /package/{policy/graphql → rules/graphql/policy}/vscode_extensions/vscode_extensions.rego +0 -0
  115. /package/{policy/graphql → rules/graphql/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
  116. /package/{mdc → rules/hasura}/hasura.mdc +0 -0
  117. /package/{policy/hasura → rules/hasura/policy}/svc_hl/svc_hl.rego +0 -0
  118. /package/{mdc → rules/image-avif}/image-avif.mdc +0 -0
  119. /package/{policy/image_avif → rules/image-avif/policy}/package_json/package_json.rego +0 -0
  120. /package/{policy/image_avif → rules/image-avif/policy}/package_json/package_json_test.rego +0 -0
  121. /package/{mdc → rules/image-compress}/image-compress.mdc +0 -0
  122. /package/{policy/image_compress → rules/image-compress/policy}/package_json/package_json.rego +0 -0
  123. /package/{mdc → rules/js-bun-db}/js-bun-db.mdc +0 -0
  124. /package/{policy/js_bun_db → rules/js-bun-db/policy}/package_json/package_json.rego +0 -0
  125. /package/{mdc → rules/js-bun-redis}/js-bun-redis.mdc +0 -0
  126. /package/{policy/js_bun_redis → rules/js-bun-redis/policy}/package_json/package_json.rego +0 -0
  127. /package/{mdc → rules/js-lint}/js-lint.mdc +0 -0
  128. /package/{policy/js_lint → rules/js-lint/policy}/lint_js_yml/lint_js_yml.rego +0 -0
  129. /package/{policy/js_lint → rules/js-lint/policy}/package_json/package_json.rego +0 -0
  130. /package/{policy/js_lint → rules/js-lint/policy}/package_json/package_json_test.rego +0 -0
  131. /package/{mdc → rules/js-mssql}/js-mssql.mdc +0 -0
  132. /package/{policy/js_mssql → rules/js-mssql/policy}/package_json/package_json.rego +0 -0
  133. /package/{mdc → rules/js-run}/js-run.mdc +0 -0
  134. /package/{policy/js_run → rules/js-run/policy}/configmap/configmap.rego +0 -0
  135. /package/{policy/js_run → rules/js-run/policy}/jsconfig/jsconfig.rego +0 -0
  136. /package/{policy/js_run → rules/js-run/policy}/jsconfig/jsconfig_test.rego +0 -0
  137. /package/{policy/js_run → rules/js-run/policy}/package_json/package_json.rego +0 -0
  138. /package/{mdc → rules/k8s}/k8s.mdc +0 -0
  139. /package/{policy/k8s → rules/k8s/policy}/base_kustomization/base_kustomization.rego +0 -0
  140. /package/{policy/k8s → rules/k8s/policy}/base_kustomization/base_kustomization_test.rego +0 -0
  141. /package/{policy/k8s → rules/k8s/policy}/base_manifest/base_manifest.rego +0 -0
  142. /package/{policy/k8s → rules/k8s/policy}/base_manifest/base_manifest_test.rego +0 -0
  143. /package/{policy/k8s → rules/k8s/policy}/gateway/gateway.rego +0 -0
  144. /package/{policy/k8s → rules/k8s/policy}/gateway/gateway_test.rego +0 -0
  145. /package/{policy/k8s → rules/k8s/policy}/hasura_configmap/hasura_configmap.rego +0 -0
  146. /package/{policy/k8s → rules/k8s/policy}/hasura_configmap/hasura_configmap_test.rego +0 -0
  147. /package/{policy/k8s → rules/k8s/policy}/hasura_httproute/hasura_httproute.rego +0 -0
  148. /package/{policy/k8s → rules/k8s/policy}/hasura_httproute/hasura_httproute_test.rego +0 -0
  149. /package/{policy/k8s → rules/k8s/policy}/hpa_pdb/hpa_pdb.rego +0 -0
  150. /package/{policy/k8s → rules/k8s/policy}/hpa_pdb/hpa_pdb_test.rego +0 -0
  151. /package/{policy/k8s → rules/k8s/policy}/kustomization/kustomization.rego +0 -0
  152. /package/{policy/k8s → rules/k8s/policy}/kustomization/kustomization_test.rego +0 -0
  153. /package/{policy/k8s → rules/k8s/policy}/manifest/manifest.rego +0 -0
  154. /package/{policy/k8s → rules/k8s/policy}/manifest/manifest_test.rego +0 -0
  155. /package/{policy/k8s → rules/k8s/policy}/svc_hl_yaml/svc_hl_yaml.rego +0 -0
  156. /package/{policy/k8s → rules/k8s/policy}/svc_hl_yaml/svc_hl_yaml_test.rego +0 -0
  157. /package/{policy/k8s → rules/k8s/policy}/svc_yaml/svc_yaml.rego +0 -0
  158. /package/{policy/k8s → rules/k8s/policy}/svc_yaml/svc_yaml_test.rego +0 -0
  159. /package/{mdc → rules/nginx-default-tpl}/nginx-default-tpl.mdc +0 -0
  160. /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_extensions/vscode_extensions.rego +0 -0
  161. /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
  162. /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_settings/vscode_settings.rego +0 -0
  163. /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_settings/vscode_settings_test.rego +0 -0
  164. /package/{mdc → rules/npm-module}/npm-module.mdc +0 -0
  165. /package/{policy/npm_module → rules/npm-module/policy}/emit_types_config/emit_types_config.rego +0 -0
  166. /package/{policy/npm_module → rules/npm-module/policy}/npm_package_json/npm_package_json.rego +0 -0
  167. /package/{policy/npm_module → rules/npm-module/policy}/npm_package_json/npm_package_json_test.rego +0 -0
  168. /package/{policy/npm_module → rules/npm-module/policy}/npm_publish_yml/npm_publish_yml.rego +0 -0
  169. /package/{policy/npm_module → rules/npm-module/policy}/root_package_json/root_package_json.rego +0 -0
  170. /package/{mdc → rules/php}/php.mdc +0 -0
  171. /package/{policy/php → rules/php/policy}/lint_php_yml/lint_php_yml.rego +0 -0
  172. /package/{policy/php → rules/php/policy}/package_json/package_json.rego +0 -0
  173. /package/{policy/rego → rules/rego/policy}/package_json/package_json.rego +0 -0
  174. /package/{policy/rego → rules/rego/policy}/package_json/package_json_test.rego +0 -0
  175. /package/{policy/rego → rules/rego/policy}/vscode_extensions/vscode_extensions.rego +0 -0
  176. /package/{policy/rego → rules/rego/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
  177. /package/{policy/rego → rules/rego/policy}/vscode_settings/vscode_settings.rego +0 -0
  178. /package/{policy/rego → rules/rego/policy}/vscode_settings/vscode_settings_test.rego +0 -0
  179. /package/{mdc → rules/rego}/rego.mdc +0 -0
  180. /package/{policy/style_lint → rules/style-lint/policy}/lint_style_yml/lint_style_yml.rego +0 -0
  181. /package/{policy/style_lint → rules/style-lint/policy}/package_json/package_json.rego +0 -0
  182. /package/{policy/style_lint → rules/style-lint/policy}/vscode_extensions/vscode_extensions.rego +0 -0
  183. /package/{policy/style_lint → rules/style-lint/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
  184. /package/{policy/style_lint → rules/style-lint/policy}/vscode_settings/vscode_settings.rego +0 -0
  185. /package/{policy/style_lint → rules/style-lint/policy}/vscode_settings/vscode_settings_test.rego +0 -0
  186. /package/{mdc → rules/style-lint}/style-lint.mdc +0 -0
  187. /package/{policy/tauri → rules/tauri/policy}/vscode_extensions/vscode_extensions.rego +0 -0
  188. /package/{policy/tauri → rules/tauri/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
  189. /package/{mdc → rules/tauri}/tauri.mdc +0 -0
  190. /package/{policy/text → rules/text/policy}/cspell/cspell.rego +0 -0
  191. /package/{policy/text → rules/text/policy}/markdownlint/markdownlint.rego +0 -0
  192. /package/{policy/text → rules/text/policy}/markdownlint/markdownlint_test.rego +0 -0
  193. /package/{policy/text → rules/text/policy}/oxfmtrc/oxfmtrc.rego +0 -0
  194. /package/{policy/text → rules/text/policy}/package_json/package_json.rego +0 -0
  195. /package/{policy/text → rules/text/policy}/vscode_extensions/vscode_extensions.rego +0 -0
  196. /package/{policy/text → rules/text/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
  197. /package/{policy/text → rules/text/policy}/vscode_settings/vscode_settings.rego +0 -0
  198. /package/{policy/text → rules/text/policy}/vscode_settings/vscode_settings_test.rego +0 -0
  199. /package/{policy/vue → rules/vue/policy}/package_json/package_json.rego +0 -0
  200. /package/{mdc → rules/vue}/vue.mdc +0 -0
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: n-adr-normalize
3
+ description: >-
4
+ Ручний запуск ADR-нормалізації — обхід порогу й min-interval, прогон одного
5
+ батчу чернеток через LLM, перегляд результату через git diff
6
+ ---
7
+
8
+ # n-adr-normalize — ручна нормалізація ADR-чернеток
9
+
10
+ Скіл запускає `.claude/hooks/normalize-decisions.sh` поза звичайним Stop-hook-тригером. Корисно, коли:
11
+
12
+ - Поріг `ADR_NORMALIZE_THRESHOLD` ще не досягнуто, але хочеш почистити inbox.
13
+ - Минулого разу LLM відмовився, тепер минув ще не весь `ADR_NORMALIZE_MIN_INTERVAL_HOURS` — хочеш повторити одразу.
14
+ - Спочатку треба побачити, що саме LLM зробить (`ADR_NORMALIZE_DRY=1`).
15
+
16
+ ## Передумови
17
+
18
+ - Правило `adr` увімкнене у `.n-cursor.json` (`"adr"` у `rules`).
19
+ - `.claude/hooks/normalize-decisions.sh` існує (`npx @nitra/cursor` поклав його сюди).
20
+ - У `PATH` доступний `claude` або `cursor-agent` (інакше скрипт мовчки вийде).
21
+ - У `docs/adr/` є чернетки — файли з `session: …` у YAML frontmatter.
22
+
23
+ ## Кроки
24
+
25
+ 1. **Dry-run** (не міняє файли, лише пише план у `.claude/hooks/normalize-decisions.log`):
26
+
27
+ ```bash
28
+ ADR_NORMALIZE_THRESHOLD=0 \
29
+ ADR_NORMALIZE_MIN_INTERVAL_HOURS=0 \
30
+ ADR_NORMALIZE_DRY=1 \
31
+ bash .claude/hooks/normalize-decisions.sh
32
+ ```
33
+
34
+ Потім переглянь план: `tail -100 .claude/hooks/normalize-decisions.log`.
35
+
36
+ 2. **Реальний прогон одного батчу** (за замовчуванням до 30 чернеток):
37
+
38
+ ```bash
39
+ ADR_NORMALIZE_THRESHOLD=0 \
40
+ ADR_NORMALIZE_MIN_INTERVAL_HOURS=0 \
41
+ bash .claude/hooks/normalize-decisions.sh
42
+ ```
43
+
44
+ 3. **Перегляд результату** — скрипт нічого не комітить:
45
+
46
+ ```bash
47
+ git status docs/adr/
48
+ git diff docs/adr/
49
+ ```
50
+
51
+ Видалені файли — `delete`-операція. Нові файли `<slug>.md` — `rewrite`. Модифіковані clean-файли — `merge-into`.
52
+
53
+ 4. **Прийняти / відкотити:**
54
+
55
+ - Прийняти все: `git add docs/adr/ && git commit -m "adr: normalize batch"`.
56
+ - Відкотити конкретний файл: `git checkout -- docs/adr/<file>` (для `rewrite` цього мало — треба ще `git restore --staged` і `rm` нового).
57
+ - Відкотити весь батч: `git checkout -- docs/adr/ && git clean -f docs/adr/` (видалить і untracked rewrite-результати).
58
+
59
+ 5. **Повторити для наступного батчу**, якщо чернеток ще багато. Кожен запуск обробляє до `ADR_NORMALIZE_BATCH` файлів (default 30, найстарші за часовою позначкою у назві).
60
+
61
+ ## Tuning через ENV
62
+
63
+ - `ADR_NORMALIZE_BATCH=10` — менший батч (менше токенів, частіші коміти).
64
+ - `ADR_NORMALIZE_MODEL=opus` — інша модель `claude -p`.
65
+ - `ADR_NORMALIZE_CURSOR_MODEL=…` — інша модель для cursor-agent fallback.
66
+
67
+ ## Якщо щось пішло не так
68
+
69
+ - LLM повернув криву JSON → у логу буде `invalid JSON response (first 200 chars): …`. Запусти ще раз — нерідко це разовий збій.
70
+ - Скрипт виходить миттєво без логу → перевір `ADR_NORMALIZE_RUNNING` у env (recursion guard) і чи репо не у стані merge/rebase.
71
+ - Перейменування зробило слаги-дублі (`<slug>-2.md`) → це нормально, скрипт детермінований; під час review можна обʼєднати руками й видалити `-2`.
@@ -0,0 +1 @@
1
+ [adr]
@@ -0,0 +1 @@
1
+ завжди
@@ -0,0 +1 @@
1
+ завжди
@@ -0,0 +1 @@
1
+ завжди
@@ -0,0 +1 @@
1
+ завжди
@@ -0,0 +1 @@
1
+ [bun]
package/bin/auto-rules.md DELETED
@@ -1,59 +0,0 @@
1
- # Авто вмикання правил
2
-
3
- В цьому файлі описані умови, по яким повинні правила автододаватись в конфіг. Умови автододавання скілів — у `auto-skills.md` (виносить логіку зі словника правил у пару «правило → скіл»).
4
-
5
- ## Правила, які автоматично додається до .n-cursor.json
6
-
7
- Синтаксис `rule - [other]` означає: правило `rule` варто автододати лише якщо всі правила у списку `[other]` вже додані до конфігу (граф залежностей між правилами; умова не дублюється).
8
-
9
- abie - якщо в кореневому package.json в секції "repository" присутній текст "<https://github.com/abinbevefes/**/>"
10
-
11
- bun - якщо в корені проекту є package.json
12
-
13
- capacitor - якщо в проекті є хоч один файл capacitor.config.json
14
-
15
- changelog - [bun]
16
-
17
- docker - якщо в проекті є хоч один Dockerfile
18
-
19
- ga - якщо присутня директорія .github/workflows
20
-
21
- graphql - якщо хоч в одному js або vue файлі присутній gql` темплейт літерал
22
-
23
- hasura - якщо в директорії присутній config.yaml, який містить рядок `metadata_directory: metadata`
24
-
25
- image-compress - [bun]
26
-
27
- image-avif - [vue, image-compress]
28
-
29
- js-lint - якщо присутній хоч один js файл
30
-
31
- js-run - якщо це вкладена директорія з package.json (не в корені) та в devDependencies немає vite
32
-
33
- js-mssql - якщо в хоч одному package.json в секції dependencies присутній пакет mssql
34
-
35
- js-bun-db - якщо в хоч одному package.json в секції dependencies присутній пакет pg, pg-format або mysql2 або є імпорт sql/SQL з Bun (приклад: import { sql } from "bun")
36
-
37
- js-bun-redis - якщо в хоч одному package.json в секції dependencies присутній пакет ioredis або node-redis
38
-
39
- k8s - якщо присутня хоч одна директорія k8s
40
-
41
- nginx-default-tpl - якщо присутній хоч один файл з переліку - default.conf.template, default.conf, nginx.conf
42
-
43
- npm-module - якщо в корені присутня директорія npm
44
-
45
- php - якщо в корені є composer.json
46
-
47
- rego - якщо в проекті є хоч один rego
48
-
49
- style-lint - якщо присутній хоч один vue або css файл
50
-
51
- tauri - - якщо в хоч в package.json в секції dependencies присутній пакет @tauri-apps/api
52
-
53
- text - завжди
54
-
55
- vue - якщо присутній хоч один vue файл
56
-
57
- ## Виключення
58
-
59
- Якщо в .n-cursor.json задано в секції disable-rules правило, то воно автоматично додаватись не повинно.
@@ -1,25 +0,0 @@
1
- # Авто вмикання скілів
2
-
3
- В цьому файлі описані умови, по яким повинні скіли автододаватись в конфіг.
4
-
5
- ## Скіли, які автоматично додається до .n-cursor.json
6
-
7
- Синтаксис `skill - [rules]` означає: скіл `skill` варто автододати лише якщо всі правила у списку `[rules]` уже додані до конфігу автодетектом (з `auto-rules.md`). Так залежність не дублює вихідну умову правила.
8
-
9
- abie-kustomize - [abie]
10
-
11
- abie-clean - [abie]
12
-
13
- fix - завжди
14
-
15
- llm-patch - завжди
16
-
17
- lint - завжди
18
-
19
- publish-telegram - завжди
20
-
21
- taze - [bun]
22
-
23
- ## Виключення
24
-
25
- Якщо в .n-cursor.json задано в секції disable-skills скіл, то він автоматично додаватись не повинен.
package/mdc/adr.mdc DELETED
@@ -1,86 +0,0 @@
1
- ---
2
- description: Автоматичний збір ADR/Runbook/Knowledge-чернеток із Stop-хука Claude Code (capture-decisions)
3
- alwaysApply: true
4
- version: '1.0'
5
- ---
6
-
7
- Правило вмикається **вручну** — додай `"adr"` у масив `rules` файлу `.n-cursor.json`. У `auto-rules.md` його немає, бо корисність залежить від робочого процесу команди (не кожен проєкт хоче літати ADR-чернеткам у `docs/`).
8
-
9
- Коли правило увімкнене, **`npx @nitra/cursor`** автоматично:
10
-
11
- - копіює канонічний bash-скрипт у **`.claude/hooks/capture-decisions.sh`** (executable, повністю керується пакетом — на кожен sync перезаписується);
12
- - додає managed-групу у **`hooks.Stop`** в **`.claude/settings.json`**, яка викликає цей скрипт асинхронно (`async: true`, `timeout: 180`);
13
- - ці зміни — додаткові до lint Stop-hook (`@nitra/cursor stop-hook`); обидві групи живуть поряд у `Stop`.
14
-
15
- ## Що робить механізм
16
-
17
- Stop-hook Claude Code зчитує JSONL-транскрипт сесії (через `jq`), витягає текст, `thinking`-блоки та назви `tool_use`-викликів, передає компактний дайджест у LLM CLI з промптом українською і записує результат у **`docs/adr/_inbox/<timestamp>-<session>.md`**, якщо модель повернула блок з шапкою `## ADR|Runbook|Knowledge …`. Якщо модель повернула `NONE` (тривіальна сесія) — нічого не пишеться. Рекурсію з внутрішнього виклику моделі блокує env-var `CAPTURE_DECISIONS_RUNNING=1`.
18
-
19
- ## LLM CLI: claude → cursor-agent fallback
20
-
21
- Скрипт сам обирає доступний CLI (порядок фіксований):
22
-
23
- 1. **`claude`** (Anthropic Claude Code CLI) — `claude -p --model "$CAPTURE_DECISIONS_CLAUDE_MODEL"` (default `sonnet`).
24
- 2. **`cursor-agent`** (Cursor IDE CLI) — `cursor-agent -p --mode ask --output-format text --model "$CAPTURE_DECISIONS_CURSOR_MODEL"` (default `claude-4.6-sonnet-medium`).
25
- 3. Жодного CLI у `PATH` — скрипт виходить з кодом `0` і нічого не пише.
26
-
27
- `--mode ask` для cursor-agent навмисно: режим Q&A read-only, без shell/edit-інструментів — для класифікації сесії інструменти не потрібні. Моделі можна перевизначити через ENV: `CAPTURE_DECISIONS_CLAUDE_MODEL`, `CAPTURE_DECISIONS_CURSOR_MODEL`.
28
-
29
- ## Структура каталогу
30
-
31
- ```text
32
- docs/adr/
33
- └── _inbox/ # чернетки, що пишуться Stop-хуком
34
- └── YYYYMMDD-HHMMSS-<sid>.md # session_id (перші 8 символів)
35
- .claude/hooks/
36
- ├── capture-decisions.sh # auto-synced з пакета
37
- └── capture-decisions.log # лог запусків (НЕ коміти)
38
- ```
39
-
40
- `.gitignore` повинен містити рядок **`.claude/hooks/capture-decisions.log`**, щоб лог не потрапляв у git.
41
-
42
- `docs/adr/_inbox/` — це робоча скринька; чернетки звідти переносяться у структуровані ADR-файли вручну (під час оглядів) або тримаються як архів сесій. Каталог сам створюється скриптом, тому пустим у git тримати не потрібно.
43
-
44
- ## Stop-hook у `.claude/settings.json`
45
-
46
- Канонічний запис, який вставляє sync (поряд із lint stop-hook):
47
-
48
- ```json title=".claude/settings.json"
49
- {
50
- "hooks": {
51
- "Stop": [
52
- {
53
- "matcher": "",
54
- "hooks": [
55
- {
56
- "type": "command",
57
- "command": "npx --no @nitra/cursor stop-hook",
58
- "timeout": 60
59
- }
60
- ]
61
- },
62
- {
63
- "matcher": "",
64
- "hooks": [
65
- {
66
- "type": "command",
67
- "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/capture-decisions.sh\"",
68
- "async": true,
69
- "timeout": 180
70
- }
71
- ]
72
- }
73
- ]
74
- }
75
- }
76
- ```
77
-
78
- Обидві групи ідентифікуються пакетом за маркером у `command` (`@nitra/cursor stop-hook` і `.claude/hooks/capture-decisions.sh`) — користувацькі hook-групи поряд не чіпаються. Якщо `adr` прибрати з `rules`, ADR-група автоматично видаляється на наступному `npx @nitra/cursor`.
79
-
80
- ## Локальні vs project-shared налаштування
81
-
82
- Stop-hook ADR живе у **project-shared** `.claude/settings.json` (закомічений), щоб механізм працював у всіх членів команди. Якщо хук колись був у `.claude/settings.local.json` — прибери дубль вручну: project-shared і local-копія створили б два запуски на одну подію.
83
-
84
- ## Перевірка
85
-
86
- `npx @nitra/cursor check adr`
@@ -1,31 +0,0 @@
1
- # Порт перевірки `.claude/settings.json` з `npm/scripts/check-adr.mjs` (adr.mdc):
2
- # `hooks.Stop[*]` має містити групу, де хоча б один елемент `hooks[]` має `command`
3
- # зі substring `.claude/hooks/capture-decisions.sh`.
4
- #
5
- # Запуск (локально):
6
- # conftest test .claude/settings.json -p npm/policy/adr \
7
- # --namespace adr.settings_json
8
- #
9
- # Hash-порівняння bash-скрипта з канонічним bundled-варіантом і `.gitignore`-перевірки
10
- # — у JS (`check-adr.mjs`).
11
- #
12
- # Структура каталогу збігається зі шляхом пакету (regal: directory-package-mismatch).
13
- # Конвенція проєкту — `import rego.v1` + multi-value `deny contains msg if { … }`
14
- # (.cursor/rules/conftest.mdc). Лінт — `bun run lint-rego` (regal).
15
- package adr.settings_json
16
-
17
- import rego.v1
18
-
19
- hook_command_marker := ".claude/hooks/capture-decisions.sh"
20
-
21
- deny contains msg if {
22
- not has_adr_stop_hook
23
- msg := ".claude/settings.json: відсутній Stop-hook для `capture-decisions.sh` у hooks.Stop (adr.mdc)"
24
- }
25
-
26
- # Чи є в `hooks.Stop[*].hooks[*].command` рядок з маркером скрипта.
27
- has_adr_stop_hook if {
28
- some group in object.get(object.get(input, "hooks", {}), "Stop", [])
29
- some hook in object.get(group, "hooks", [])
30
- contains(object.get(hook, "command", ""), hook_command_marker)
31
- }
@@ -1,28 +0,0 @@
1
- # Порт перевірки `.claude/settings.local.json` з `npm/scripts/check-adr.mjs`
2
- # (adr.mdc): після переходу на project-shared `settings.json` цей файл (якщо є)
3
- # НЕ повинен мати дубля Stop-хука з маркером `.claude/hooks/capture-decisions.sh`,
4
- # інакше один і той самий скрипт виконається двічі на одну подію.
5
- #
6
- # Запуск (локально):
7
- # conftest test .claude/settings.local.json -p npm/policy/adr \
8
- # --namespace adr.settings_local_json
9
- #
10
- # Структура каталогу збігається зі шляхом пакету (regal: directory-package-mismatch).
11
- # Конвенція проєкту — `import rego.v1` + multi-value `deny contains msg if { … }`
12
- # (.cursor/rules/conftest.mdc). Лінт — `bun run lint-rego` (regal).
13
- package adr.settings_local_json
14
-
15
- import rego.v1
16
-
17
- hook_command_marker := ".claude/hooks/capture-decisions.sh"
18
-
19
- duplicate_template := concat(" ", [
20
- ".claude/settings.local.json: видали дубль Stop-хука для",
21
- "`capture-decisions.sh` — він уже у project-shared settings.json (adr.mdc)",
22
- ])
23
-
24
- deny contains duplicate_template if {
25
- some group in object.get(object.get(input, "hooks", {}), "Stop", [])
26
- some hook in object.get(group, "hooks", [])
27
- contains(object.get(hook, "command", ""), hook_command_marker)
28
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes