@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.
- package/.claude-template/hooks/capture-decisions.sh +3 -3
- package/.claude-template/hooks/normalize-decisions.sh +370 -0
- package/CHANGELOG.md +43 -0
- package/bin/n-cursor.js +56 -49
- package/package.json +10 -5
- package/rules/abie/auto.md +1 -0
- package/{scripts/check-abie.mjs → rules/abie/js/check.mjs} +5 -5
- package/rules/adr/adr.mdc +150 -0
- package/{scripts/check-adr.mjs → rules/adr/js/check.mjs} +85 -41
- package/rules/adr/policy/settings_json/settings_json.rego +37 -0
- package/rules/adr/policy/settings_local_json/settings_local_json.rego +40 -0
- package/rules/bun/auto.md +1 -0
- package/{scripts/check-bun.mjs → rules/bun/js/check.mjs} +1 -1
- package/rules/capacitor/auto.md +1 -0
- package/{scripts/check-capacitor.mjs → rules/capacitor/js/check.mjs} +1 -1
- package/rules/changelog/auto.md +1 -0
- package/{scripts/check-changelog.mjs → rules/changelog/js/check.mjs} +2 -2
- package/rules/docker/auto.md +1 -0
- package/{scripts/check-docker.mjs → rules/docker/js/check.mjs} +5 -5
- package/{scripts/run-docker.mjs → rules/docker/js/run.mjs} +5 -5
- package/rules/ga/auto.md +1 -0
- package/{scripts/check-ga.mjs → rules/ga/js/check.mjs} +4 -4
- package/{scripts/lint-ga.mjs → rules/ga/js/lint.mjs} +2 -2
- package/rules/graphql/auto.md +1 -0
- package/{scripts/check-graphql.mjs → rules/graphql/js/check.mjs} +5 -5
- package/rules/hasura/auto.md +1 -0
- package/{scripts/check-hasura.mjs → rules/hasura/js/check.mjs} +4 -4
- package/rules/image-avif/auto.md +1 -0
- package/{scripts/check-image-avif.mjs → rules/image-avif/js/check.mjs} +5 -5
- package/rules/image-compress/auto.md +1 -0
- package/{scripts/check-image-compress.mjs → rules/image-compress/js/check.mjs} +1 -1
- package/rules/js-bun-db/auto.md +1 -0
- package/{scripts/check-js-bun-db.mjs → rules/js-bun-db/js/check.mjs} +5 -5
- package/rules/js-bun-redis/auto.md +1 -0
- package/{scripts/check-js-bun-redis.mjs → rules/js-bun-redis/js/check.mjs} +4 -4
- package/rules/js-lint/auto.md +1 -0
- package/{scripts/check-js-lint.mjs → rules/js-lint/js/check.mjs} +1 -1
- package/rules/js-mssql/auto.md +1 -0
- package/{scripts/check-js-mssql.mjs → rules/js-mssql/js/check.mjs} +5 -5
- package/rules/js-run/auto.md +1 -0
- package/{scripts/check-js-run.mjs → rules/js-run/js/check.mjs} +11 -11
- package/rules/k8s/auto.md +1 -0
- package/{scripts/check-k8s.mjs → rules/k8s/js/check.mjs} +4 -4
- package/{scripts/run-k8s.mjs → rules/k8s/js/run.mjs} +4 -4
- package/rules/nginx-default-tpl/auto.md +1 -0
- package/{scripts/check-nginx-default-tpl.mjs → rules/nginx-default-tpl/js/check.mjs} +7 -7
- package/rules/npm-module/auto.md +1 -0
- package/{scripts/check-npm-module.mjs → rules/npm-module/js/check.mjs} +4 -4
- package/rules/php/auto.md +1 -0
- package/{scripts/check-php.mjs → rules/php/js/check.mjs} +1 -1
- package/{scripts/run-php.mjs → rules/php/js/run.mjs} +3 -3
- package/rules/rego/auto.md +1 -0
- package/{scripts/check-rego.mjs → rules/rego/js/check.mjs} +4 -4
- package/{scripts/lint-rego.mjs → rules/rego/js/lint.mjs} +1 -1
- package/rules/style-lint/auto.md +1 -0
- package/{scripts/check-style-lint.mjs → rules/style-lint/js/check.mjs} +1 -1
- package/rules/tauri/auto.md +1 -0
- package/{scripts/check-tauri.mjs → rules/tauri/js/check.mjs} +2 -2
- package/rules/text/auto.md +1 -0
- package/{scripts/check-text.mjs → rules/text/js/check.mjs} +2 -2
- package/{scripts/run-shellcheck-text.mjs → rules/text/js/run-shellcheck.mjs} +2 -2
- package/{scripts → rules/text/js}/run-v8r.mjs +2 -2
- package/{mdc → rules/text}/text.mdc +4 -0
- package/rules/vue/auto.md +1 -0
- package/{scripts/check-vue.mjs → rules/vue/js/check.mjs} +5 -5
- package/scripts/auto-rules.mjs +5 -5
- package/scripts/auto-skills.mjs +8 -6
- package/scripts/lint-conftest.mjs +13 -13
- package/scripts/sync-claude-config.mjs +70 -14
- package/scripts/utils/run-conftest-batch.mjs +9 -4
- package/skills/abie-clean/auto.md +1 -0
- package/skills/abie-kustomize/auto.md +1 -0
- package/skills/adr-normalize/SKILL.md +71 -0
- package/skills/adr-normalize/auto.md +1 -0
- package/skills/fix/auto.md +1 -0
- package/skills/lint/auto.md +1 -0
- package/skills/llm-patch/auto.md +1 -0
- package/skills/publish-telegram/auto.md +1 -0
- package/skills/taze/auto.md +1 -0
- package/bin/auto-rules.md +0 -59
- package/bin/auto-skills.md +0 -25
- package/mdc/adr.mdc +0 -86
- package/policy/adr/settings_json/settings_json.rego +0 -31
- package/policy/adr/settings_local_json/settings_local_json.rego +0 -28
- /package/{mdc → rules/abie}/abie.mdc +0 -0
- /package/{policy/abie → rules/abie/policy}/base_deployment_preem/base_deployment_preem.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/base_deployment_preem/base_deployment_preem_test.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/clean_merged_ignore_branches/clean_merged_ignore_branches.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/clean_merged_ignore_branches/clean_merged_ignore_branches_test.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/health_check_policy/health_check_policy.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/health_check_policy/health_check_policy_test.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/http_route_base/http_route_base.rego +0 -0
- /package/{policy/abie → rules/abie/policy}/http_route_base/http_route_base_test.rego +0 -0
- /package/{mdc → rules/bun}/bun.mdc +0 -0
- /package/{policy/bun → rules/bun/policy}/bunfig/bunfig.rego +0 -0
- /package/{policy/bun → rules/bun/policy}/package_json/package_json.rego +0 -0
- /package/{policy/bun → rules/bun/policy}/package_json/package_json_test.rego +0 -0
- /package/{mdc → rules/capacitor}/capacitor.mdc +0 -0
- /package/{policy/capacitor → rules/capacitor/policy}/package_json/package_json.rego +0 -0
- /package/{mdc → rules/changelog}/changelog.mdc +0 -0
- /package/{mdc → rules/ci4}/ci4.mdc +0 -0
- /package/{mdc → rules/docker}/docker.mdc +0 -0
- /package/{policy/docker → rules/docker/policy}/lint_docker_yml/lint_docker_yml.rego +0 -0
- /package/{policy/docker → rules/docker/policy}/lint_docker_yml/lint_docker_yml_test.rego +0 -0
- /package/{policy/docker → rules/docker/policy}/package_json/package_json.rego +0 -0
- /package/{policy/docker → rules/docker/policy}/package_json/package_json_test.rego +0 -0
- /package/{mdc → rules/ga}/ga.mdc +0 -0
- /package/{policy/ga → rules/ga/policy}/clean_ga_workflows/clean_ga_workflows.rego +0 -0
- /package/{policy/ga → rules/ga/policy}/clean_merged_branch/clean_merged_branch.rego +0 -0
- /package/{policy/ga → rules/ga/policy}/git_ai/git_ai.rego +0 -0
- /package/{policy/ga → rules/ga/policy}/lint_ga/lint_ga.rego +0 -0
- /package/{policy/ga → rules/ga/policy}/workflow_common/workflow_common.rego +0 -0
- /package/{mdc → rules/graphql}/graphql.mdc +0 -0
- /package/{policy/graphql → rules/graphql/policy}/vscode_extensions/vscode_extensions.rego +0 -0
- /package/{policy/graphql → rules/graphql/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
- /package/{mdc → rules/hasura}/hasura.mdc +0 -0
- /package/{policy/hasura → rules/hasura/policy}/svc_hl/svc_hl.rego +0 -0
- /package/{mdc → rules/image-avif}/image-avif.mdc +0 -0
- /package/{policy/image_avif → rules/image-avif/policy}/package_json/package_json.rego +0 -0
- /package/{policy/image_avif → rules/image-avif/policy}/package_json/package_json_test.rego +0 -0
- /package/{mdc → rules/image-compress}/image-compress.mdc +0 -0
- /package/{policy/image_compress → rules/image-compress/policy}/package_json/package_json.rego +0 -0
- /package/{mdc → rules/js-bun-db}/js-bun-db.mdc +0 -0
- /package/{policy/js_bun_db → rules/js-bun-db/policy}/package_json/package_json.rego +0 -0
- /package/{mdc → rules/js-bun-redis}/js-bun-redis.mdc +0 -0
- /package/{policy/js_bun_redis → rules/js-bun-redis/policy}/package_json/package_json.rego +0 -0
- /package/{mdc → rules/js-lint}/js-lint.mdc +0 -0
- /package/{policy/js_lint → rules/js-lint/policy}/lint_js_yml/lint_js_yml.rego +0 -0
- /package/{policy/js_lint → rules/js-lint/policy}/package_json/package_json.rego +0 -0
- /package/{policy/js_lint → rules/js-lint/policy}/package_json/package_json_test.rego +0 -0
- /package/{mdc → rules/js-mssql}/js-mssql.mdc +0 -0
- /package/{policy/js_mssql → rules/js-mssql/policy}/package_json/package_json.rego +0 -0
- /package/{mdc → rules/js-run}/js-run.mdc +0 -0
- /package/{policy/js_run → rules/js-run/policy}/configmap/configmap.rego +0 -0
- /package/{policy/js_run → rules/js-run/policy}/jsconfig/jsconfig.rego +0 -0
- /package/{policy/js_run → rules/js-run/policy}/jsconfig/jsconfig_test.rego +0 -0
- /package/{policy/js_run → rules/js-run/policy}/package_json/package_json.rego +0 -0
- /package/{mdc → rules/k8s}/k8s.mdc +0 -0
- /package/{policy/k8s → rules/k8s/policy}/base_kustomization/base_kustomization.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/base_kustomization/base_kustomization_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/base_manifest/base_manifest.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/base_manifest/base_manifest_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/gateway/gateway.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/gateway/gateway_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/hasura_configmap/hasura_configmap.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/hasura_configmap/hasura_configmap_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/hasura_httproute/hasura_httproute.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/hasura_httproute/hasura_httproute_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/hpa_pdb/hpa_pdb.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/hpa_pdb/hpa_pdb_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/kustomization/kustomization.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/kustomization/kustomization_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/manifest/manifest.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/manifest/manifest_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/svc_hl_yaml/svc_hl_yaml.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/svc_hl_yaml/svc_hl_yaml_test.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/svc_yaml/svc_yaml.rego +0 -0
- /package/{policy/k8s → rules/k8s/policy}/svc_yaml/svc_yaml_test.rego +0 -0
- /package/{mdc → rules/nginx-default-tpl}/nginx-default-tpl.mdc +0 -0
- /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_extensions/vscode_extensions.rego +0 -0
- /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
- /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_settings/vscode_settings.rego +0 -0
- /package/{policy/nginx_default_tpl → rules/nginx-default-tpl/policy}/vscode_settings/vscode_settings_test.rego +0 -0
- /package/{mdc → rules/npm-module}/npm-module.mdc +0 -0
- /package/{policy/npm_module → rules/npm-module/policy}/emit_types_config/emit_types_config.rego +0 -0
- /package/{policy/npm_module → rules/npm-module/policy}/npm_package_json/npm_package_json.rego +0 -0
- /package/{policy/npm_module → rules/npm-module/policy}/npm_package_json/npm_package_json_test.rego +0 -0
- /package/{policy/npm_module → rules/npm-module/policy}/npm_publish_yml/npm_publish_yml.rego +0 -0
- /package/{policy/npm_module → rules/npm-module/policy}/root_package_json/root_package_json.rego +0 -0
- /package/{mdc → rules/php}/php.mdc +0 -0
- /package/{policy/php → rules/php/policy}/lint_php_yml/lint_php_yml.rego +0 -0
- /package/{policy/php → rules/php/policy}/package_json/package_json.rego +0 -0
- /package/{policy/rego → rules/rego/policy}/package_json/package_json.rego +0 -0
- /package/{policy/rego → rules/rego/policy}/package_json/package_json_test.rego +0 -0
- /package/{policy/rego → rules/rego/policy}/vscode_extensions/vscode_extensions.rego +0 -0
- /package/{policy/rego → rules/rego/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
- /package/{policy/rego → rules/rego/policy}/vscode_settings/vscode_settings.rego +0 -0
- /package/{policy/rego → rules/rego/policy}/vscode_settings/vscode_settings_test.rego +0 -0
- /package/{mdc → rules/rego}/rego.mdc +0 -0
- /package/{policy/style_lint → rules/style-lint/policy}/lint_style_yml/lint_style_yml.rego +0 -0
- /package/{policy/style_lint → rules/style-lint/policy}/package_json/package_json.rego +0 -0
- /package/{policy/style_lint → rules/style-lint/policy}/vscode_extensions/vscode_extensions.rego +0 -0
- /package/{policy/style_lint → rules/style-lint/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
- /package/{policy/style_lint → rules/style-lint/policy}/vscode_settings/vscode_settings.rego +0 -0
- /package/{policy/style_lint → rules/style-lint/policy}/vscode_settings/vscode_settings_test.rego +0 -0
- /package/{mdc → rules/style-lint}/style-lint.mdc +0 -0
- /package/{policy/tauri → rules/tauri/policy}/vscode_extensions/vscode_extensions.rego +0 -0
- /package/{policy/tauri → rules/tauri/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
- /package/{mdc → rules/tauri}/tauri.mdc +0 -0
- /package/{policy/text → rules/text/policy}/cspell/cspell.rego +0 -0
- /package/{policy/text → rules/text/policy}/markdownlint/markdownlint.rego +0 -0
- /package/{policy/text → rules/text/policy}/markdownlint/markdownlint_test.rego +0 -0
- /package/{policy/text → rules/text/policy}/oxfmtrc/oxfmtrc.rego +0 -0
- /package/{policy/text → rules/text/policy}/package_json/package_json.rego +0 -0
- /package/{policy/text → rules/text/policy}/vscode_extensions/vscode_extensions.rego +0 -0
- /package/{policy/text → rules/text/policy}/vscode_extensions/vscode_extensions_test.rego +0 -0
- /package/{policy/text → rules/text/policy}/vscode_settings/vscode_settings.rego +0 -0
- /package/{policy/text → rules/text/policy}/vscode_settings/vscode_settings_test.rego +0 -0
- /package/{policy/vue → rules/vue/policy}/package_json/package_json.rego +0 -0
- /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 правило, то воно автоматично додаватись не повинно.
|
package/bin/auto-skills.md
DELETED
|
@@ -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
|
/package/{policy/abie → rules/abie/policy}/base_deployment_preem/base_deployment_preem_test.rego
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{policy/abie → rules/abie/policy}/health_check_policy/health_check_policy_test.rego
RENAMED
|
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
|
/package/{mdc → rules/ga}/ga.mdc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{policy/graphql → rules/graphql/policy}/vscode_extensions/vscode_extensions_test.rego
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/{policy/image_compress → rules/image-compress/policy}/package_json/package_json.rego
RENAMED
|
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
|
|
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
|
|
File without changes
|
/package/{policy/npm_module → rules/npm-module/policy}/emit_types_config/emit_types_config.rego
RENAMED
|
File without changes
|
/package/{policy/npm_module → rules/npm-module/policy}/npm_package_json/npm_package_json.rego
RENAMED
|
File without changes
|
/package/{policy/npm_module → rules/npm-module/policy}/npm_package_json/npm_package_json_test.rego
RENAMED
|
File without changes
|
|
File without changes
|
/package/{policy/npm_module → rules/npm-module/policy}/root_package_json/root_package_json.rego
RENAMED
|
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
|
/package/{policy/style_lint → rules/style-lint/policy}/vscode_extensions/vscode_extensions.rego
RENAMED
|
File without changes
|
/package/{policy/style_lint → rules/style-lint/policy}/vscode_extensions/vscode_extensions_test.rego
RENAMED
|
File without changes
|
|
File without changes
|
/package/{policy/style_lint → rules/style-lint/policy}/vscode_settings/vscode_settings_test.rego
RENAMED
|
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
|