@nitra/cursor 5.3.4 → 5.4.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 (151) hide show
  1. package/.claude-template/settings.template.json +2 -2
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
  3. package/CHANGELOG.md +11 -0
  4. package/bin/n-cursor.js +43 -22
  5. package/lib/docs/models.md +29 -18
  6. package/lib/docs/omlx-trace.md +51 -0
  7. package/lib/docs/omlx.md +31 -15
  8. package/lib/omlx.mjs +2 -5
  9. package/package.json +1 -1
  10. package/rules/abie/docs/fix.md +17 -11
  11. package/rules/adr/docs/fix.md +25 -140
  12. package/rules/bun/docs/fix.md +18 -151
  13. package/rules/capacitor/docs/fix.md +16 -13
  14. package/rules/capacitor/js/docs/platforms.md +31 -43
  15. package/rules/changelog/docs/fix.md +25 -169
  16. package/rules/ci4/docs/fix.md +11 -14
  17. package/rules/doc-files/doc-files.mdc +60 -0
  18. package/rules/doc-files/docs/fix.md +31 -0
  19. package/rules/doc-files/fix.mjs +19 -0
  20. package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
  21. package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
  22. package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
  23. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  24. package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
  25. package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
  26. package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +1 -1
  27. package/{skills → rules}/doc-files/js/docs/docgen-gen.md +1 -1
  28. package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
  29. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  30. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  31. package/rules/doc-files/js/docs/lint.md +36 -0
  32. package/rules/doc-files/js/docs/units-js.md +31 -0
  33. package/rules/doc-files/js/docs/units-rs.md +35 -0
  34. package/rules/doc-files/js/docs/units.md +30 -0
  35. package/rules/doc-files/js/lint.mjs +96 -0
  36. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  37. package/rules/doc-files/lint/docs/lint.md +37 -0
  38. package/rules/doc-files/lint/lint.mjs +105 -0
  39. package/rules/doc-files/meta.json +1 -0
  40. package/rules/docker/docs/fix.md +21 -161
  41. package/rules/efes/docs/fix.md +23 -194
  42. package/rules/feedback/docs/fix.md +10 -8
  43. package/rules/ga/docs/fix.md +10 -5
  44. package/rules/graphql/docs/fix.md +23 -119
  45. package/rules/hasura/docs/fix.md +19 -5
  46. package/rules/hasura/js/docs/internal_urls.md +34 -307
  47. package/rules/image-avif/docs/fix.md +16 -127
  48. package/rules/image-compress/docs/fix.md +20 -141
  49. package/rules/image-compress/js/docs/package_setup.md +22 -182
  50. package/rules/js-bun-db/docs/fix.md +23 -139
  51. package/rules/js-bun-db/js/docs/safety.md +33 -221
  52. package/rules/js-bun-redis/docs/fix.md +25 -114
  53. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  54. package/rules/js-lint/docs/fix.md +30 -108
  55. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  56. package/rules/js-lint/js/docs/lint.md +22 -238
  57. package/rules/js-lint/js/docs/tooling.md +34 -331
  58. package/rules/js-lint-ci/docs/fix.md +16 -149
  59. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  60. package/rules/js-mssql/docs/fix.md +18 -123
  61. package/rules/js-mssql/js/docs/deps.md +28 -251
  62. package/rules/js-run/docs/fix.md +23 -138
  63. package/rules/js-run/js/docs/runtime.md +24 -378
  64. package/rules/k8s/docs/fix.md +18 -123
  65. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  66. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  67. package/rules/npm-module/docs/fix.md +27 -89
  68. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  69. package/rules/npm-module/js/docs/package_structure.md +36 -258
  70. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  71. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  72. package/rules/php/docs/fix.md +21 -98
  73. package/rules/php/js/docs/tooling.md +20 -143
  74. package/rules/python/docs/fix.md +25 -157
  75. package/rules/python/js/docs/applies.md +20 -98
  76. package/rules/python/js/docs/tooling.md +27 -144
  77. package/rules/rego/docs/fix.md +24 -112
  78. package/rules/rego/js/docs/applies.md +20 -164
  79. package/rules/rego/js/docs/lint.md +15 -110
  80. package/rules/release/docs/fix.md +16 -114
  81. package/rules/rust/docs/fix.md +24 -119
  82. package/rules/rust/js/docs/applies.md +20 -129
  83. package/rules/security/docs/fix.md +21 -78
  84. package/rules/security/js/docs/sample_secret.md +23 -182
  85. package/rules/security/js/docs/trufflehog.md +19 -128
  86. package/rules/style-lint/docs/fix.md +16 -150
  87. package/rules/style-lint/js/docs/lint.md +21 -172
  88. package/rules/style-lint/js/docs/tooling.md +19 -184
  89. package/rules/tauri/docs/fix.md +26 -152
  90. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  91. package/rules/tauri/js/docs/tooling.md +20 -217
  92. package/rules/test/docs/fix.md +19 -127
  93. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  94. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  95. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  96. package/rules/test/js/docs/location.md +24 -126
  97. package/rules/test/js/docs/no-process-chdir.md +20 -151
  98. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  99. package/rules/test/js/docs/stryker_config.md +48 -148
  100. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  101. package/rules/text/docs/fix.md +25 -113
  102. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  103. package/rules/text/js/docs/formatting.md +60 -251
  104. package/rules/text/js/docs/lint.md +17 -114
  105. package/rules/vue/docs/fix.md +25 -118
  106. package/rules/vue/js/docs/packages.md +25 -323
  107. package/rules/worktree/docs/fix.md +31 -150
  108. package/scripts/coverage-classify/docs/index.md +23 -209
  109. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  110. package/scripts/dispatcher/docs/trace.md +35 -0
  111. package/scripts/docs/auto-rules.md +37 -361
  112. package/scripts/docs/lint-cli.md +12 -13
  113. package/scripts/docs/post-tool-use-fix.md +16 -15
  114. package/scripts/docs/skills-cli.md +26 -23
  115. package/scripts/docs/sync-claude-config.md +94 -34
  116. package/scripts/docs/worktree-cli.md +11 -34
  117. package/scripts/lib/docs/assert-project-root.md +14 -16
  118. package/scripts/lib/docs/changed-files.md +24 -139
  119. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  120. package/scripts/lib/docs/rule-predicates.md +20 -17
  121. package/scripts/lib/docs/run-rule-cli.md +14 -18
  122. package/scripts/lib/docs/run-rule.md +13 -20
  123. package/scripts/lib/docs/run-standard-rule.md +12 -15
  124. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  125. package/scripts/lib/rule-predicates.mjs +1 -1
  126. package/scripts/sync-claude-config.mjs +4 -1
  127. package/scripts/utils/docs/with-lock.md +19 -12
  128. package/scripts/utils/with-lock.mjs +4 -2
  129. package/skills/doc-aggregate/SKILL.md +2 -2
  130. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  131. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  132. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  133. package/skills/doc-files/.changes/260612-0031.md +5 -0
  134. package/skills/doc-files/.changes/260612-0036.md +5 -0
  135. package/skills/doc-files/.changes/260612-0114.md +5 -0
  136. package/skills/doc-files/SKILL.md +6 -6
  137. package/skills/fix/js/docs/llm-worker.md +17 -15
  138. package/skills/fix/js/docs/orchestrator.md +30 -23
  139. package/skills/fix/js/docs/t0.md +26 -16
  140. package/skills/start-check/js/docs/check.md +26 -22
  141. package/skills/taze/js/docs/diff.md +44 -20
  142. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  143. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  144. package/skills/doc-files/js/docs/units-rs.md +0 -35
  145. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  146. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  147. /package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +0 -0
  148. /package/{skills → rules}/doc-files/js/docgen-gen.mjs +0 -0
  149. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  150. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  151. /package/{skills → rules}/doc-files/js/units.mjs +0 -0
@@ -1,163 +1,31 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/scripts/lib/discover-check-rules-from-cursor.mjs
4
- crc: 5e312e3e
4
+ crc: 9a6916e1
5
+ score: 100
5
6
  ---
6
7
 
7
8
  # discover-check-rules-from-cursor.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Модуль `discover-check-rules-from-cursor.mjs` визначає, які саме id правил повинні бути запущені командою `npx @nitra/cursor fix`, коли користувач викликає її **без аргументів**. Він узгоджує два джерела:
12
+ Файл зчитує базові імена файлів `.mdc` у директорії `.cursor/rules/` та генерує список ідентифікаторів правил для `npx @nitra/cursor fix`, використовуючи перевірку через JS-концерн або policy з `target.json`.
12
13
 
13
- 1. **Файлова система проєкту** — базові імена `*.mdc` у директорії `.cursor/rules/` (тобто правила, які реально присутні у конкретному репо).
14
- 2. **Реєстр пакета** — список id правил, для яких у пакеті `@nitra/cursor` існує programmatic перевірка (JS-концерн або policy з `target.json`); цей список зазвичай приходить із функції `discoverCheckableRules`.
14
+ ## Поведінка
15
15
 
16
- Результат впорядкований унікальний масив id, у якому:
16
+ MANAGED_RULE_FILE_PREFIX Визначає префікс керованих правил пакета у файлах `.cursor/rules/`.
17
17
 
18
- - порядок диктується порядком файлів `*.mdc` у директорії правил (як їх передали ззовні, зазвичай відсортованими);
19
- - залишаються лише ті id, для яких у пакеті є реальна перевірка;
20
- - видалено префікс `n-`, оскільки внутрішня команда `check <id>` оперує «короткими» id (наприклад, `bun`, а не `n-bun`).
18
+ mdcBasenameToCheckId Перетворює базове ім'я `.mdc` у id правила для `check <id>`.
21
19
 
22
- Файл містить чисті pure-функції без побічних ефектів без `fs`, без `process`, без I/O. Все читання директорії правил і реєстру здійснюється викликачем; цей модуль лише поєднує два готових списки.
20
+ discoverCheckRulesFromCursorRules Будує впорядкований список id перевірок за файлами правил на диску, фільтруючи їх за наявністю у доступних перевірок.
23
21
 
24
- ## Експорти / API
22
+ ## Публічний API
25
23
 
26
- Модуль має три публічних експорти у форматі ES modules (`.mjs`):
24
+ MANAGED_RULE_FILE_PREFIX визначає префікс для керованих правил у директорії `.cursor/rules/`.
25
+ mdcBasenameToCheckId — трансформує базове ім'я файлу `.mdc` у ідентифікатор правила для функції `check`.
26
+ discoverCheckRulesFromCursorRules — створює відсортований список ідентифікаторів перевірок на основі файлів правил з курсору.
27
27
 
28
- | Експорт | Тип | Призначення |
29
- | ----------------------------------- | ---------- | ------------------------------------------------------------------------------------------------ |
30
- | `MANAGED_RULE_FILE_PREFIX` | `string` | Константа `'n-'` — префікс імен файлів `.mdc`, які вважаються «керованими» пакетом. |
31
- | `mdcBasenameToCheckId` | `function` | Перетворює базове ім'я `*.mdc` (із розширенням або без) у id для CLI-команди `check`. |
32
- | `discoverCheckRulesFromCursorRules` | `function` | Будує впорядкований список id перевірок як перетин «доступних у пакеті» та «присутніх на диску». |
28
+ ## Гарантії поведінки
33
29
 
34
- Усі експорти іменовані (`export const` / `export function`); default-export відсутній.
35
-
36
- ## Функції
37
-
38
- ### `mdcBasenameToCheckId(mdcBasename)`
39
-
40
- **Сигнатура:**
41
-
42
- ```js
43
- export function mdcBasenameToCheckId(mdcBasename: string): string
44
- ```
45
-
46
- **Параметри:**
47
-
48
- - `mdcBasename` — рядок, який може бути:
49
- - чистим базовим іменем файлу, наприклад `'n-bun.mdc'` або `'my-rule.mdc'`;
50
- - відносним/абсолютним шляхом, наприклад `'.cursor/rules/n-bun.mdc'` (функція сама візьме сегмент після останнього `/`).
51
-
52
- **Поведінка:**
53
-
54
- 1. Якщо у вхідному рядку є символ `/`, береться підрядок після останнього `/` — таким чином приймаються як «чисті» імена, так і шляхи.
55
- 2. Якщо отриманий рядок закінчується на `.mdc`, розширення відсікається.
56
- 3. Якщо те, що залишилось, починається з `MANAGED_RULE_FILE_PREFIX` (`'n-'`), цей префікс також знімається.
57
- 4. Повертається отриманий «короткий» id.
58
-
59
- **Повертає:**
60
-
61
- - `string` — id, придатний для команди `check <id>`. Приклади:
62
- - `'n-bun.mdc'` → `'bun'`
63
- - `'.cursor/rules/n-vue.mdc'` → `'vue'`
64
- - `'my-rule.mdc'` → `'my-rule'`
65
- - `'n-text'` (без розширення) → `'text'`
66
-
67
- **Side effects:** немає. Функція суто детермінована, не звертається до файлової системи, не мутує аргументи.
68
-
69
- **Крайні випадки:**
70
-
71
- - Backslashes (`\\`) як роздільник шляху **не** розпізнаються — функція оперує лише `/`. Це безпечно для шляхів, які прийшли від утиліт на кшталт `fs.readdir`, що повертають базові імена, або з `path.posix`-стилю.
72
- - Якщо вхід уже без `.mdc`, він обробляється тим самим алгоритмом (просто пропускається крок зняття розширення).
73
- - Якщо файл, прибравши `.mdc`, дорівнює саме `'n-'`, повернеться порожній рядок — це не очікувана реальна ситуація, бо керованих правил із порожнім id не буває.
74
-
75
- ### `discoverCheckRulesFromCursorRules(available, mdcBasenames)`
76
-
77
- **Сигнатура:**
78
-
79
- ```js
80
- export function discoverCheckRulesFromCursorRules(
81
- available: string[],
82
- mdcBasenames: string[],
83
- ): string[]
84
- ```
85
-
86
- **Параметри:**
87
-
88
- - `available` — масив id, які пакет уміє перевіряти (програмні перевірки JS-концерну або policy з `target.json`). Зазвичай — результат `discoverCheckableRules` із сусіднього модуля `discover-checkable-rules.mjs`. Очікується алфавітний порядок, але алгоритм не залежить від нього.
89
- - `mdcBasenames` — масив базових імен файлів `*.mdc`, які реально присутні у `.cursor/rules/` поточного проєкту. Очікується, що масив уже відсортований викликачем (порядок цього масиву визначає порядок результату).
90
-
91
- **Поведінка:**
92
-
93
- 1. Створюється `Set` `seen` для дедуплікації результату.
94
- 2. Створюється масив `ordered` для збереження порядку входу `mdcBasenames`.
95
- 3. Для кожного `basename`:
96
- - обчислюється id через `mdcBasenameToCheckId(basename)`;
97
- - якщо id присутній у `available` **і** ще не доданий — додається в `ordered` та позначається у `seen`.
98
- 4. Повертається `ordered`.
99
-
100
- **Повертає:**
101
-
102
- - `string[]` — впорядкований масив унікальних id перевірок:
103
- - **тільки** ті, що одночасно (а) мають programmatic-перевірку в пакеті і (б) представлені файлом `*.mdc` у `.cursor/rules/`;
104
- - порядок диктується `mdcBasenames` (тобто реальним порядком файлів у директорії, як його передав викликач);
105
- - кожен id зустрічається не більше одного разу.
106
-
107
- **Side effects:** немає. Функція pure, не читає диск, не мутує аргументи (`Set`/`Array` створюються локально).
108
-
109
- **Крайні випадки:**
110
-
111
- - Якщо `mdcBasenames` порожній — повертається `[]`.
112
- - Якщо жоден `id`, отриманий з імен `.mdc`, не присутній у `available` — повертається `[]` (типово для проєктів, де `.cursor/rules/` містить лише сторонні правила без programmatic-перевірок у пакеті).
113
- - Дублікати у `mdcBasenames` (наприклад, два файли, що дають один і той самий id після відсікання префікса) включаються лише один раз.
114
-
115
- ## Залежності
116
-
117
- - **Зовнішні (npm/Node):** немає. Файл не використовує жодних імпортів — ні з Node core (`fs`, `path` тощо), ні з npm-пакетів.
118
- - **Внутрішні (проєкт):** немає прямих імпортів. Очікується, що:
119
- - аргумент `available` формується сусіднім модулем `discover-checkable-rules.mjs` (експорт `discoverCheckableRules`);
120
- - аргумент `mdcBasenames` формується викликачем читанням `.cursor/rules/` (через `fs.readdirSync`/`fs.promises.readdir` із подальшим фільтром `.endsWith('.mdc')` та сортуванням).
121
-
122
- Така архітектура свідомо відокремлює I/O від чистої логіки: цей модуль легко тестувати без файлової системи.
123
-
124
- ## Потік виконання / Використання
125
-
126
- Типовий сценарій — `npx @nitra/cursor fix` без аргументів. CLI-входу потрібно вирішити, які id перевірок запустити за замовчуванням; для цього він:
127
-
128
- 1. Отримує список програмно перевірюваних правил пакета (`available = discoverCheckableRules(...)`).
129
- 2. Читає директорію `.cursor/rules/` поточного проєкту й відбирає файли з розширенням `.mdc` (`mdcBasenames`), сортує їх.
130
- 3. Викликає `discoverCheckRulesFromCursorRules(available, mdcBasenames)` і отримує **підсумковий** список id.
131
- 4. Для кожного id послідовно запускає команду `check <id>` (наприклад, через `run-rule-cli.mjs`).
132
-
133
- Приклад інлайн-використання (псевдокод викликача):
134
-
135
- ```js
136
- import { readdirSync } from 'node:fs'
137
- import { discoverCheckableRules } from './discover-checkable-rules.mjs'
138
- import { discoverCheckRulesFromCursorRules } from './discover-check-rules-from-cursor.mjs'
139
-
140
- const available = discoverCheckableRules(/* … */)
141
- const mdcBasenames = readdirSync('.cursor/rules')
142
- .filter(f => f.endsWith('.mdc'))
143
- .sort()
144
- const idsToRun = discoverCheckRulesFromCursorRules(available, mdcBasenames)
145
- // idsToRun: наприклад, ['adr', 'bun', 'ci4', 'text', 'vue']
146
- ```
147
-
148
- Приклад трансформації імен:
149
-
150
- | Файл у `.cursor/rules/` | id після `mdcBasenameToCheckId` | Потрапляє у результат? |
151
- | -------------------------- | ------------------------------- | -------------------------------------------------- |
152
- | `n-bun.mdc` | `bun` | Так, якщо `available.includes('bun')` |
153
- | `n-vue.mdc` | `vue` | Так, якщо `available.includes('vue')` |
154
- | `my-rule.mdc` | `my-rule` | Лише якщо пакет реєструє `my-rule` як перевірюване |
155
- | `.cursor/rules/n-text.mdc` | `text` | Так, якщо `available.includes('text')` |
156
- | `n-bun.mdc` (двічі) | `bun` | У результаті — один раз |
157
-
158
- Таким чином модуль є тонким, але критичним «клейовим» шаром між:
159
-
160
- - **диском проєкту** (що користувач реально хоче перевіряти, судячи з вмісту `.cursor/rules/`)
161
- - **реєстром пакета** (що пакет фізично вміє перевіряти автоматично).
162
-
163
- Файл свідомо тримається без I/O і без зовнішніх залежностей, щоб залишатись повністю детермінованим і легко покритим юніт-тестами (див. сусідню директорію `tests/`).
30
+ - Read-only: файл не виконує операцій запису у файлову систему.
31
+ - Не звертається до мережі.
@@ -1,30 +1,33 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/rule-predicates.mjs
4
+ crc: 71fba574
5
+ score: 95
6
+ ---
7
+
1
8
  # rule-predicates.mjs
2
9
 
3
10
  ## Огляд
4
11
 
5
- Цей файл містить набір предикатів, які використовуються для автоматичного визначення правил. Ці предикати дозволяють перевіряти наявність файлів, вміст source-коду та інформацію з репозиторіїв, щоб виявляти потенційні порушення правил. Він забезпечує механізм для автоматизованого пошуку та виявлення правил на основі даних.
12
+ Реєстр незводимих до даних предикатів для автодетекту правил. Предикати використовують наявність файлів або вмісту для визначення умов. Умови, що вимагають парсингу залежностей чи сканування вмісту, читають дані з різних джерел. Виклик диспетчується через `auto-rules.mjs` за іменем предиката.
6
13
 
7
14
  ## Поведінка
8
15
 
9
- 1. **Ініціалізація перевірки репозиторію:** Отримує URL репозиторію з кореневого `package.json` або з `meta.json.repository`. Перевіряє, чи URL існує і чи містить він вказаний маркер.
10
- 2. **Перевірка залежностей у дереві:** Для кожного `package.json` у дереві репозиторію, перебирає всі пакети в залежностях. Якщо пакет має вказаний маркер, повертає `true`. Ігнорує директорії `node_modules`, `.git`, `.next` та `.turbo`.
11
- 3. **Перевірка вкладених `package.json`:** Для кореневого `package.json` перевіряє, чи є в будь-якому вкладеному `package.json` відсутній `vite` у секції `devDependencies`. Ігнорує директорії `node_modules`, `.git`, `.next` та `.turbo`.
12
- 4. **Перевірка фактів:** Якщо надано факти, перевіряє наявність `hasGqlTaggedTemplates` та `hasHasuraConfig`. Якщо `hasGqlTaggedTemplates` має значення `true`, повертає `true`. Якщо `hasHasuraConfig` має значення `true`, повертає `true`.
13
- 5. **Перевірка наявності `bun`:** Якщо надано факти, перевіряє наявність `hasBunSqlImport`. Якщо `hasBunSqlImport` має значення `true`, повертає `true`.
14
- 6. **Перевірка залежностей `pg`:** Якщо надано факти, перевіряє наявність `pg`, `pg-format` або `mysql2` у залежностях. Якщо будь-яка з цих залежностей присутня, повертає `true`.
15
- 7. **Перевірка вкладеного `package.json` без `vite`:** Отримує кореневий `package.json`. Перебирає всі вкладені `package.json` (крім кореневого). Якщо вкладений `package.json` не містить `vite` у `devDependencies`, повер
16
+ 1. repoUrlMarker: Перевіряє, чи містить URL репозиторію вказаний маркер.
17
+ 2. depInAnyPackageJson: Перевіряє наявність пакетів у залежностях.
18
+ 3. gqlTaggedTemplate: Перевіряє наявність літерала gql.
19
+ 4. hasuraConfigMarker: Перевіряє наявність маркера в конфігурації.yaml.
20
+ 5. jsBunDbSignal: Перевіряє наявність залежностей або імпорту SQL з Bun.
21
+ 6. nestedPackageWithoutVite: Перевіряє наявність пропущеного пакету у devDependencies.
16
22
 
17
23
  ## Публічний API
18
24
 
19
- RULE_PREDICATES — Зберігає предикати та їх реалізації. Використовується для виклику через `meta.json.auto.predicate`.
25
+ RULE_PREDICATES — Реєстр предикатів: імʼя реалізація. Виклик за `meta.json.auto.predicate`.
20
26
 
21
27
  ## Гарантії поведінки
22
28
 
23
- - Функція повертає результат виконання предиката.
24
- - Результат може бути істинним або хибним.
25
- - При виникненні помилки, результат завжди хибний.
26
- - Не враховує наявність `.git` та `node_modules` у файловій системі.
27
- - Не використовує кешування.
28
- - Не генерує винятків.
29
- - Аргументи предиката можуть бути значеннями, отриманими з файлів `meta.json`, шляхів у файловій системі або URL-адрес.
30
- - Результат залежить від вмісту та структури зазначених джерел.
29
+ - Read-only: файл не виконує операцій запису у файлову систему.
30
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
31
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
32
+ - Свідомо пропускає шляхи: `.git`, `node_modules`.
33
+ - Не звертається до мережі.
@@ -1,33 +1,29 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/scripts/lib/run-rule-cli.mjs
4
- crc: ab1715f2
4
+ crc: 21a7b19a
5
+ score: 100
5
6
  ---
6
7
 
7
8
  # run-rule-cli.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Цей файл є самостійним CLI-запускомком для правила, який дозволяє запускати правила з файлів `.n-cursor.json` та виконувати їхні дії. Він забезпечує інтеграцію з інструментом `cursor`, імітуючи старий `npx @nitra/cursor fix <id>`. Файл виконує перевірку whitelist, генерує summary та повертає агрегований код виходу.
12
+ Файл є автономним CLI-запускачем для одного правила. Він читає конфігурацію з `.n-cursor.json`, перевіряє, чи існує запис для заданого ID у конфігурації, друкує звіт про перевірку та повертає агрегований код виходу.
12
13
 
13
14
  ## Поведінка
14
15
 
15
- 1. Визначає ID правила на основі шляху директорії правила.
16
- 2. Зчитує конфігурацію з файлу `.n-cursor.json`.
17
- 3. Перевіряє, чи правило включено в конфігурації. Якщо ні, пропускає перевірку та повертає код успіху (0).
18
- 4. Виводить інформаційне повідомлення про початок перевірки правила.
19
- 5. Створює або отримує кеш для обходу файлової структури.
20
- 6. Запускає стандартний процес перевірки правила, передаючи кеш.
21
- 7. Отримує код завершення процесу перевірки правила.
22
- 8. Виводить підсумковий результат перевірки (успіх або невдача).
23
- 9. Повертає код завершення процесу перевірки правила.
16
+ 1. Викликається для запуску правила.
17
+ 2. Читає конфігурацію з `.n-cursor.json`.
18
+ 3. Перевіряє наявність правила у whitelist.
19
+ 4. Якщо правило не дозволено, друкує повідомлення про пропуск.
20
+ 5. Якщо правило дозволено, друкує повідомлення про перевірку правила.
21
+ 6. Використовує кеш для перевірки.
22
+ 7. Викликає функцію для виконання стандартного правила з кешем.
23
+ 8. Повертає агрегований код виходу.
24
24
 
25
25
  ## Гарантії поведінки
26
26
 
27
- - Запускає правило з файлу `fix.mjs`.
28
- - Читає файл `.n-cursor.json` для конфігурації правила.
29
- - Перевіряє, чи правило включено в whitelist.
30
- - Виводить підсумкову інформацію про результат виконання.
31
- - Повертає код завершення, що відображає загальний статус виконання.
32
- - Кешує результати для уникнення повторного виконання, поки не змінено конфігурацію або не було перезапущено.
33
- - Не здійснює жодних мережевих запитів.
27
+ - Read-only: файл не виконує операцій запису у файлову систему.
28
+ - Кешує результати в межах одного прогону.
29
+ - Не звертається до мережі.
@@ -1,38 +1,31 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/scripts/lib/run-rule.mjs
4
- crc: 94f3ac44
4
+ crc: 27060842
5
+ score: 95
5
6
  ---
6
7
 
7
8
  # run-rule.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Цей файл є оркестратором правил, що запускається з командного рядка. Він застосовує правила, визначаючи та виконуючи концерни, а також політичні концерни, використовуючи кешування для підвищення ефективності. Файл забезпечує централізований спосіб виконання правил та збору результатів.
12
+ Файл слугує оркестратором правила. Він координує виконання перевірок, включаючи перевірку гейту, JS-концернів та policy-концернів.
12
13
 
13
14
  ## Поведінка
14
15
 
15
- - `runTemplateSubsetConcern`: Перевіряє файл-концерт за допомогою шаблону, повертаючи 0, якщо все ОК, або 1, якщо є порушення.
16
- - `evaluateAppliesGate`: Викликає функцію `applies` з `js/applies.mjs`, якщо вона існує та повертає `true`.
17
- - `runPolicyConcern`: Запускає policy-концерт через `runConftestBatch`, повертаючи 0, якщо все ОК, або 1, якщо є порушення.
18
- - `runRule`: Оркеструє правила, викликаючи `evaluateAppliesGate`, JS-концерни та policy-концерни, об'єднуючи exit-коди.
16
+ runTemplateSubsetConcern
17
+ Перевіряє відповідність фактичного файлу канонічному шаблону.
18
+
19
+ runRule
20
+ Оркеструє виконання правила, включаючи перевірку гейту, JS-концернів та policy-концернів.
19
21
 
20
22
  ## Публічний API
21
23
 
22
- - runTemplateSubsetConcern — Перевірка відповідності шаблонів: порівнює конфігурацію шаблонів з фактичним файлом, забезпечуючи дотримання правил.
23
- - runRule — Запуск правила: виконує послідовність дій, включаючи перевірку концернів, і застосовує політику.
24
+ - runTemplateSubsetConcern — Snippet-driven перевірка концерну (`target.json:"check":"template"`): звіряє канон з фактичним файлом за допомогою глибокого підмножинного перевірки. Усі канонічні поля/елементи обов'язкові, зайві дозволені. Масиви співпадають за наявністю (незалежно від порядку). Зміна сніпета негайно впливає на примусовість.
25
+ - runRule — Запускає одне правило: applies-гейт JS-концерни policy-концерни.
24
26
 
25
27
  ## Гарантії поведінки
26
28
 
27
- - `applies-гейт` викликає `applies` з `js/applies.mjs`.
28
- - `applies` повертає `false` виводить `✅ правило не застосовне` і завершує.
29
- - `JS-концерни` викликають `applies` після `applies-гейт`.
30
- - `JS-концерни` можуть викликати `check` для виведення контексту.
31
- - `Policy-концерни` викликають `runConftestBatch`.
32
- - `resolveTargetFiles` кешує результати `walkCache` між `JS-концернами`.
33
- - `createCheckReporter` у `Policy-концерни` OR-ює exit-коди.
34
- - Exit-код правила — 0 або 1.
35
- - `runTemplateSubsetConcern` запускає підмножину шаблонів.
36
- - `runRule` запускає правило.
37
- - Кеш використовується для зберігання результатів `resolveTargetFiles` у межах прогону.
38
- - Немає взаємодії з мережею.
29
+ - Read-only: файл не виконує операцій запису у файлову систему.
30
+ - Кешує результати в межах одного прогону.
31
+ - Не звертається до мережі.
@@ -1,30 +1,27 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/scripts/lib/run-standard-rule.mjs
4
- crc: aeb5299a
4
+ crc: c1ae8f0e
5
+ score: 90
5
6
  ---
6
7
 
7
8
  # run-standard-rule.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Цей файл забезпечує публічний інтерфейс для оркестрування правил. Він обігріває виклик `discoverOneRule` до виконання правил, керуючи їхнім виконанням на основі контексту та політики. Це централізована точка інтеграції для запуску правил, забезпечуючи дедуплікацію та кешування для оптимізації продуктивності.
12
+ Файл інкапсулює оркестрацію виконання правил. Він забезпечує запуск правила через визначений шлях, ізолюючи його виконання у блоці `withLock` для уникнення паралельних запусків.
12
13
 
13
14
  ## Поведінка
14
15
 
15
- 1. Отримує шлях до директорії правила.
16
- 2. Визначає ідентифікатор правила з назви директорії.
17
- 3. Отримує дані правила з директорії правила.
18
- 4. Отримує або створює кеш для прогону.
19
- 5. Запускає виконання правила, використовуючи отримані дані та кеш.
20
- 6. Забезпечує унікальний лок для паралельного запуску правила.
21
- 7. Повертає код успіху (0) або код помилки (1) в залежності від результатів виконання правила.
16
+ 1. Отримання шляху до правила
17
+ 2. Визначення ідентифікатора правила
18
+ 3. Охоплення виконання у блоці блокування
19
+ 4. Пошук правила
20
+ 5. Отримання кешу проходу
21
+ 6. Запуск виконання правила
22
22
 
23
23
  ## Гарантії поведінки
24
24
 
25
- - Виконання правил інкапсулює логіку `discoverOneRule` та `runRule`.
26
- - Виконання правил відбувається всередині блоку `withLock`.
27
- - Виконання правил дедублюється на основі стану git-дерева.
28
- - Різні правила можуть виконуватися паралельно.
29
- - Кеш використовується для зберігання результатів виконання правил в межах одного прогону.
30
- - Не допускається локальна логіка всередині правил. Розширення поведінки реалізується через опції контексту.
25
+ - Read-only: файл не виконує операцій запису у файлову систему.
26
+ - Кешує результати в межах одного прогону.
27
+ - Не звертається до мережі.
@@ -1,31 +1,28 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/sync-gitignore-worktree.mjs
4
+ crc: e691c42b
5
+ score: 95
6
+ ---
7
+
1
8
  # sync-gitignore-worktree.mjs
2
9
 
3
10
  ## Огляд
4
11
 
5
- Файл забезпечує, що кореневий `.gitignore` проєкту ігнорує локальні git-worktree. Він гарантує, що всі артефакти, пов'язані з worktree, правильно включені в `.gitignore`, забезпечуючи консистентність та уникнення непередбачуваних проблем. Це ключовий компонент системи завжди-активного flow/worktree-tooling.
12
+ syncGitignoreWorktree
13
+ Додає запис `.worktrees/` до кореневого `.gitignore`. Функція викликається для синхронізації локальних git-worktree з конфігурацією. Функція приймає шлях до кореня проєкту-споживача. Функція повертає результат, що вказує на успішність запису.
6
14
 
7
15
  ## Поведінка
8
16
 
9
- 1. Визначає корінь проєкту.
10
- 2. Перевіряє наявність в кореневому файлі `.gitignore` запису, що відповідає каталогу `.worktrees/`.
11
- 3. Якщо запису немає, викликає утиліту для додавання запису `.worktrees/` до `.gitignore`.
12
- 4. Утиліта додає запис, якщо його ще немає, інакше не робить нічого.
13
- 5. Повертає значення `true`, якщо запис було додано, інакше `false`.
17
+ 1. Виклик функції для додавання запису `.worktrees/` до кореневого `.gitignore`.
18
+ 2. Передача шляху до кореня проєкту-споживача.
19
+ 3. Повернення результату, що вказує на успішність запису.
14
20
 
15
21
  ## Публічний API
16
22
 
17
- syncGitignoreWorktree — Синхронізує файл `.gitignore` в каталозі `worktrees` з кореневим файлом `.gitignore`.
23
+ syncGitignoreWorktree — Додає `.worktrees/` до `.gitignore` у кореневому файлі.
18
24
 
19
25
  ## Гарантії поведінки
20
26
 
21
- - Гарантує, що кореневий `.gitignore` проєкту ігнорує локальні git-worktree (`.worktrees/`).
22
- - Викликається з дефолтного sync (`npx \@nitra/cursor`) окремим top-level кроком.
23
- - Не викликається в контексті `syncClaudeConfig`.
24
- - `.worktrees/` є артефактом завжди-активного flow/worktree-tooling.
25
- - Один запис `.worktrees/` покриває каталог worktree та всі sibling-файли в ньому.
26
- - Запис безумовний, без гейта за `.n-cursor.json`-правилами.
27
- - Продюсер артефактів — завжди-активний flow.
28
- - Делегує наявній idempotent+append-only утиліті `ensureGitignoreEntries`.
29
- - `ensureGitignoreEntries` не перезаписує/не видаляє наявні рядки.
30
- - `ensureGitignoreEntries` створює `.gitignore`, якщо нема.
31
- - Не використовує кешування.
27
+ - Read-only: файл не виконує операцій запису у файлову систему.
28
+ - Не звертається до мережі.
@@ -21,7 +21,7 @@ const IGNORED_DIR_NAMES = new Set(['node_modules', '.git', '.next', '.turbo'])
21
21
  * @param {string[]} keys імена пакетів
22
22
  * @returns {Promise<boolean>} true, якщо знайдено хоч один
23
23
  */
24
- async function anyDepInTree(root, keys) {
24
+ function anyDepInTree(root, keys) {
25
25
  const wanted = new Set(keys)
26
26
  /**
27
27
  * Чи package.json за `abs` оголошує будь-який пакет із `wanted` у `dependencies`.
@@ -33,7 +33,9 @@ import { join } from 'node:path'
33
33
  /** Маркер PostToolUse fix-hook'а (`npx --no \@nitra/cursor post-tool-use-fix`). */
34
34
  export const MANAGED_HOOK_COMMAND_MARKER = '@nitra/cursor post-tool-use-fix'
35
35
  /** Маркер doc-files staleness-hook'ів (PostToolUse `--hook` і Stop-гейт `--git`). */
36
- export const DOC_FILES_HOOK_COMMAND_MARKER = '@nitra/cursor doc-files check'
36
+ export const DOC_FILES_HOOK_COMMAND_MARKER = '@nitra/cursor lint-doc-files'
37
+ /** Legacy-маркер старих doc-files hook'ів (`doc-files check`) — cleanup при ресинку наявних інсталяцій. */
38
+ export const LEGACY_DOC_FILES_HOOK_COMMAND_MARKER = '@nitra/cursor doc-files check'
37
39
  /** Legacy-маркер старого Stop-hook'а — лишаємо для cleanup-у при оновленні існуючих інсталяцій. */
38
40
  export const LEGACY_STOP_HOOK_COMMAND_MARKER = '@nitra/cursor stop-hook'
39
41
  /** Маркер ADR Stop-hook'а — підрядок шляху до bash-скрипта capture-decisions. */
@@ -51,6 +53,7 @@ export const CURSOR_ADR_NORMALIZE_HOOK_COMMAND_MARKER = '.claude/hooks/normalize
51
53
  export const MANAGED_HOOK_COMMAND_MARKERS = Object.freeze([
52
54
  MANAGED_HOOK_COMMAND_MARKER,
53
55
  DOC_FILES_HOOK_COMMAND_MARKER,
56
+ LEGACY_DOC_FILES_HOOK_COMMAND_MARKER,
54
57
  LEGACY_STOP_HOOK_COMMAND_MARKER,
55
58
  ADR_HOOK_COMMAND_MARKER,
56
59
  ADR_NORMALIZE_HOOK_COMMAND_MARKER
@@ -1,25 +1,32 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/utils/with-lock.mjs
4
+ crc: 21848085
5
+ score: 95
6
+ ---
7
+
1
8
  # with-lock.mjs
2
9
 
3
10
  ## Огляд
4
11
 
5
- Цей файл реалізує механізм захисту від одночасного виконання критичних операцій, забезпечуючи атомарний lock та дедуплікацію даних для інтенсивних команд. Він використовується для запобігання конфліктів при одночасному виконанні операцій, які можуть призвести до пошкодження даних або непередбачуваних результатів. Механізм гарантує, що кожен прогін операцій виконується без повторень та з атомарним lock.
12
+ Файл реалізує механізм захисту важких команд через атомарне блокування та унікалізацію результатів. Функції дозволяють перевіряти можливість повторного використання результату з кешу та виконувати команду через серіалізований механізм. Механізм використовує `mkdirSync-based lock` та `sha256-dedup` з TTL.
6
13
 
7
14
  ## Поведінка
8
15
 
9
- - `shouldDedup`: Перевіряє, чи можна повторно використати кешований результат, враховуючи код виходу, відбитковий дерева та час завершення.
10
- - `withLock`: Встановлює lock-директорію, запускає вказану функцію, кешує результат та повторно використовує його, якщо можливо, з використанням дедуплікації за відбитком.
16
+ shouldDedup
17
+ Перевіряє можливість повторного використання результату з кешу.
18
+
19
+ withLock
20
+ Серіалізує важку команду через атомарний lock та dedup.
11
21
 
12
22
  ## Публічний API
13
23
 
14
- - shouldDedup — Перевіряє, чи можна використовувати попередньо обчислену відповідь для уникнення повторних обчислень.
15
- - withLock — Забезпечує унікальність виконання важкої операції за допомогою блокування та перевірки на основі відбитків.
24
+ shouldDedup — Чи можна пропустити повторний прогін за кешованим result.json.
25
+ withLock — Серіалізує важку команду через атомарний lock і dedup за fingerprint.
16
26
 
17
27
  ## Гарантії поведінки
18
28
 
19
- - **Атомарність:** Операції lock та dedup виконуються як атомарні дії.
20
- - **Захист від помилок:** У разі виникнення помилки, функція повертає `false` та `null`.
21
- - **Детектування неактивного PID:** Перевіряється, чи процес, що утримує lock, все ще активний.
22
- - **Дедуплікація з обмеженням часу:** Проводиться дедуплікація за допомогою SHA256 з обмеженням часу (TTL).
23
- - **Кешування:** Результати прогону кешуються для прискорення наступних проходів.
24
- - **Відсутність винятків:** Функції не викликають винятків.
25
- - **Створення директорій:** Використовується `mkdirSync` для створення директорій.
29
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
30
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
31
+ - Кешує результати в межах одного прогону.
32
+ - Не звертається до мережі.
@@ -126,9 +126,11 @@ export async function withLock(key, runFn, opts = {}) {
126
126
  /* result.json не існує або пошкоджений */
127
127
  }
128
128
 
129
- const onSignal = () => {
129
+ // Після release лок ре-рейзиться той самий сигнал: `once` вже зняв обробник,
130
+ // тож процес завершується дефолтною дією з коректним кодом (130/143)
131
+ const onSignal = signal => {
130
132
  release()
131
- process.exit(130)
133
+ process.kill(process.pid, signal)
132
134
  }
133
135
  process.once('SIGINT', onSignal)
134
136
  process.once('SIGTERM', onSignal)
@@ -29,10 +29,10 @@ Tier 3 — **один** субагент-синтезатор після зав
29
29
  - Файлові доки мають бути свіжі. Перевір і за потреби онови перед агрегацією:
30
30
 
31
31
  ```bash
32
- npx @nitra/cursor doc-files check --git
32
+ npx @nitra/cursor lint-doc-files --git
33
33
  ```
34
34
 
35
- Якщо багато застарілих — спершу прожени `npx @nitra/cursor doc-files gen`.
35
+ Якщо багато застарілих — спершу прожени `npx @nitra/cursor fix-doc-files`.
36
36
 
37
37
  ## Крок 1: Tier 2 — module-summary
38
38
 
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Re-export спільного списку ignore-глобів зі скіла doc-files.
2
+ * Re-export спільного списку ignore-глобів із правила doc-files.
3
3
  *
4
- * Канонічне джерело — `npm/skills/doc-files/js/docgen-ignore.mjs`: обидва скіли
5
- * (file-level доки і агрегати) мусять бачити однакове дерево кодових файлів,
6
- * інакше агрегат посилатиметься на файли без док (або навпаки). Залежність
7
- * спрямована doc-aggregate → doc-files за ADR про розбиття docgen.
4
+ * Канонічне джерело — `npm/rules/doc-files/js/docgen-ignore.mjs`: скіл doc-aggregate
5
+ * і правило doc-files мусять бачити однакове дерево кодових файлів, інакше агрегат
6
+ * посилатиметься на файли без док (або навпаки). Залежність спрямована
7
+ * doc-aggregate → doc-files за ADR про розбиття docgen.
8
8
  */
9
- export * from '../../doc-files/js/docgen-ignore.mjs'
9
+ export * from '../../../rules/doc-files/js/docgen-ignore.mjs'
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/skills/doc-aggregate/js/docgen-ignore.mjs
4
- crc: 8821af65
4
+ crc: 5faaffd0
5
5
  ---
6
6
 
7
7
  # docgen-ignore