@nitra/cursor 4.1.0 → 4.1.1

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 (132) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/bin/n-cursor.js +25 -13
  3. package/lib/models.mjs +1 -2
  4. package/package.json +1 -1
  5. package/rules/abie/fix.mjs +1 -1
  6. package/rules/bun/docs/fix.md +3 -0
  7. package/rules/bun/fix.mjs +1 -1
  8. package/rules/capacitor/fix.mjs +1 -1
  9. package/rules/changelog/docs/fix.md +3 -0
  10. package/rules/changelog/fix.mjs +1 -1
  11. package/rules/ci4/fix.mjs +1 -1
  12. package/rules/ci4/js/docs/marksman_config.md +1 -0
  13. package/rules/docker/docs/fix.md +1 -1
  14. package/rules/docker/fix.mjs +1 -1
  15. package/rules/docker/lint/docs/lint.md +1 -0
  16. package/rules/efes/docs/fix.md +2 -1
  17. package/rules/efes/fix.mjs +1 -1
  18. package/rules/feedback/fix.mjs +1 -1
  19. package/rules/ga/fix.mjs +1 -1
  20. package/rules/ga/js/lint.mjs +1 -1
  21. package/rules/graphql/docs/fix.md +4 -1
  22. package/rules/graphql/fix.mjs +1 -1
  23. package/rules/graphql/lib/docs/graphql-gql-scan.md +3 -0
  24. package/rules/hasura/fix.mjs +1 -1
  25. package/rules/image-avif/docs/fix.md +4 -1
  26. package/rules/image-avif/fix.mjs +1 -1
  27. package/rules/image-avif/js/docs/avif_generation.md +1 -0
  28. package/rules/image-compress/fix.mjs +1 -1
  29. package/rules/js-bun-db/fix.mjs +1 -1
  30. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +6 -0
  31. package/rules/js-bun-redis/fix.mjs +1 -1
  32. package/rules/js-lint/fix.mjs +1 -1
  33. package/rules/js-lint/js/docs/utils_imports.md +1 -0
  34. package/rules/js-lint-ci/docs/fix.md +4 -1
  35. package/rules/js-lint-ci/fix.mjs +1 -1
  36. package/rules/js-mssql/docs/fix.md +3 -0
  37. package/rules/js-mssql/fix.mjs +1 -1
  38. package/rules/js-mssql/lib/docs/mssql-pool-scan.md +9 -0
  39. package/rules/js-run/docs/fix.md +3 -0
  40. package/rules/js-run/fix.mjs +1 -1
  41. package/rules/js-run/lib/docs/check-env-scan.md +2 -1
  42. package/rules/js-run/lib/docs/promise-settimeout-scan.md +4 -0
  43. package/rules/k8s/docs/fix.md +3 -0
  44. package/rules/k8s/fix.mjs +1 -1
  45. package/rules/nginx-default-tpl/docs/fix.md +3 -0
  46. package/rules/nginx-default-tpl/fix.mjs +1 -1
  47. package/rules/npm-module/fix.mjs +1 -1
  48. package/rules/npm-module/js/header_doc_pointer.mjs +14 -3
  49. package/rules/php/docs/fix.md +2 -1
  50. package/rules/php/fix.mjs +1 -1
  51. package/rules/python/docs/fix.md +4 -1
  52. package/rules/python/fix.mjs +1 -1
  53. package/rules/rego/fix.mjs +1 -1
  54. package/rules/rego/js/lint.mjs +1 -1
  55. package/rules/release/docs/fix.md +4 -1
  56. package/rules/release/fix.mjs +1 -1
  57. package/rules/rust/fix.mjs +1 -1
  58. package/rules/security/docs/fix.md +1 -1
  59. package/rules/security/fix.mjs +1 -1
  60. package/rules/style-lint/docs/fix.md +3 -0
  61. package/rules/style-lint/fix.mjs +1 -1
  62. package/rules/tauri/docs/fix.md +4 -1
  63. package/rules/tauri/fix.mjs +1 -1
  64. package/rules/test/docs/fix.md +3 -0
  65. package/rules/test/fix.mjs +1 -1
  66. package/rules/test/js/no-relative-fs-path.mjs +2 -1
  67. package/rules/text/docs/fix.md +3 -0
  68. package/rules/text/fix.mjs +1 -1
  69. package/rules/text/js/lint.mjs +1 -1
  70. package/rules/vue/fix.mjs +1 -1
  71. package/rules/worktree/fix.mjs +1 -1
  72. package/scripts/auto-rules.mjs +1 -1
  73. package/scripts/coverage-classify/index.mjs +10 -10
  74. package/scripts/coverage-fix.mjs +2 -2
  75. package/scripts/dispatcher/graph/lib/cmd-init.mjs +112 -0
  76. package/scripts/dispatcher/graph/lib/cmd-invalidate.mjs +96 -0
  77. package/scripts/dispatcher/graph/lib/cmd-kill.mjs +141 -0
  78. package/scripts/dispatcher/graph/lib/cmd-plan.mjs +142 -0
  79. package/scripts/dispatcher/graph/lib/cmd-run.mjs +328 -0
  80. package/scripts/dispatcher/graph/lib/cmd-scan.mjs +115 -0
  81. package/scripts/dispatcher/graph/lib/cmd-setup.mjs +111 -0
  82. package/scripts/dispatcher/graph/lib/cmd-signals.mjs +328 -0
  83. package/scripts/dispatcher/graph/lib/cmd-status.mjs +131 -0
  84. package/scripts/dispatcher/graph/lib/cmd-verify.mjs +100 -0
  85. package/scripts/dispatcher/graph/lib/cmd-watch.mjs +128 -0
  86. package/scripts/dispatcher/graph/lib/config.mjs +103 -0
  87. package/scripts/dispatcher/graph/lib/frontmatter.mjs +224 -0
  88. package/scripts/dispatcher/graph/lib/nnn.mjs +127 -0
  89. package/scripts/dispatcher/graph/lib/node-state.mjs +157 -0
  90. package/scripts/dispatcher/graph/lib/scanner.mjs +235 -0
  91. package/scripts/dispatcher/graph/lib/worktree-ops.mjs +193 -0
  92. package/scripts/dispatcher/graph-tasks.mjs +92 -0
  93. package/scripts/dispatcher/index.mjs +3 -3
  94. package/scripts/dispatcher/lib/docs/events.md +1 -0
  95. package/scripts/dispatcher/lib/executor.mjs +1 -1
  96. package/scripts/dispatcher/lib/subagent-runner.mjs +9 -9
  97. package/scripts/dispatcher/trace.mjs +6 -2
  98. package/scripts/docs/build-agents-commands.md +1 -0
  99. package/scripts/docs/cli-entry.md +6 -0
  100. package/scripts/graph/index.mjs +115 -0
  101. package/scripts/graph/lib/config.mjs +62 -0
  102. package/scripts/graph/lib/dag.mjs +161 -0
  103. package/scripts/graph/lib/frontmatter.mjs +70 -0
  104. package/scripts/graph/lib/nnn.mjs +77 -0
  105. package/scripts/graph/lib/state.mjs +110 -0
  106. package/scripts/graph/scan.mjs +64 -0
  107. package/scripts/graph/status.mjs +86 -0
  108. package/scripts/lib/docs/load-cursor-config.md +3 -0
  109. package/scripts/lib/root-notice.mjs +4 -2
  110. package/scripts/lib/rule-predicates.mjs +1 -1
  111. package/scripts/lib/worktree-notice.mjs +14 -7
  112. package/scripts/lib/worktree.mjs +3 -2
  113. package/scripts/utils/resolve-js-root.mjs +2 -1
  114. package/scripts/utils/with-lock.mjs +1 -1
  115. package/skills/docgen/js/docgen-batch.mjs +7 -7
  116. package/skills/docgen/js/docgen-extract.mjs +80 -37
  117. package/skills/docgen/js/docgen-ignore.mjs +1 -1
  118. package/skills/docgen/js/docgen-prompts.mjs +21 -5
  119. package/skills/fix/js/llm-worker.mjs +19 -22
  120. package/skills/fix/js/orchestrator.mjs +6 -7
  121. package/skills/fix/js/t0.mjs +14 -13
  122. package/types/bin/n-cursor.d.ts +1 -1
  123. package/rules/flow/docs/fix.md +0 -152
  124. package/rules/flow/fix.mjs +0 -18
  125. package/rules/flow/flow.mdc +0 -127
  126. package/rules/flow/meta.json +0 -1
  127. package/scripts/dispatcher/lib/docs/flow-lock.md +0 -161
  128. package/scripts/dispatcher/lib/docs/flow-resolve.md +0 -267
  129. package/scripts/dispatcher/lib/flow-plan.mjs +0 -153
  130. package/scripts/dispatcher/lib/flow-resolve.mjs +0 -156
  131. package/scripts/dispatcher/lib/flow-signals.mjs +0 -235
  132. package/scripts/dispatcher/lib/flow-verify.mjs +0 -127
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.1.1] - 2026-06-08
4
+
5
+ ### Changed
6
+
7
+ - @nitra/cursor 4
8
+
3
9
  ## [4.1.0] - 2026-06-07
4
10
 
5
11
  ### Added
package/bin/n-cursor.js CHANGED
@@ -1141,7 +1141,6 @@ async function runSyncStep(prefix, action) {
1141
1141
  * захаращують термінал. Тому буфер скидається в реальний stdout **лише**
1142
1142
  * коли крок повернув `fail > 0` (або кинув виняток); за `fail === 0` —
1143
1143
  * відкидається мовчки.
1144
- *
1145
1144
  * @template T
1146
1145
  * @param {() => Promise<T>} action крок синку, що повертає обʼєкт із лічильником помилок `fail`
1147
1146
  * @returns {Promise<T>} результат `action` без змін
@@ -1564,21 +1563,28 @@ const ROOT_GUARDED_COMMANDS = new Set([undefined, '', 'fix', 'check', 'lint', 'c
1564
1563
  function describeRootGuardedAction(cmd) {
1565
1564
  switch (cmd) {
1566
1565
  case undefined:
1567
- case '':
1566
+ case '': {
1568
1567
  return 'Дефолтна синхронізація скаффолдить .cursor/, .claude/, CLAUDE.md, .n-cursor.json і робить bun install у поточному каталозі'
1568
+ }
1569
1569
  case 'fix':
1570
- case 'check':
1570
+ case 'check': {
1571
1571
  return '`fix` запускає programmatic-перевірки правил, що переписують конфіги в поточному каталозі'
1572
- case 'lint':
1572
+ }
1573
+ case 'lint': {
1573
1574
  return '`lint` запускає авто-fix лінтерів (oxfmt/eslint --fix/stylelint --fix) у поточному каталозі'
1574
- case 'coverage':
1575
+ }
1576
+ case 'coverage': {
1575
1577
  return '`coverage` генерує COVERAGE.md і Stryker-артефакти в поточному каталозі'
1576
- case 'change':
1578
+ }
1579
+ case 'change': {
1577
1580
  return '`change` пише change-файл у .changes/ поточного каталогу'
1578
- case 'release':
1581
+ }
1582
+ case 'release': {
1579
1583
  return '`release` бампає version і переписує CHANGELOG у поточному каталозі'
1580
- default:
1584
+ }
1585
+ default: {
1581
1586
  return 'Команда @nitra/cursor мутує проєкт у поточному каталозі'
1587
+ }
1582
1588
  }
1583
1589
  }
1584
1590
 
@@ -1768,10 +1774,16 @@ try {
1768
1774
  break
1769
1775
  }
1770
1776
  case 'graph': {
1771
- // n-cursor graph — read-only позиція DAG вузлів (node-dag-state spec):
1772
- // status сканує docs/graphs/<g>/nodes/ і деривує статус кожного вузла.
1773
- const { runGraphCli } = await import('../scripts/dispatcher/graph.mjs')
1774
- process.exitCode = runGraphCli(args)
1777
+ // n-cursor graph — task DAG orchestration system (думка.MD, file-presence protocol)
1778
+ const { runGraphTasksCli } = await import('../scripts/dispatcher/graph-tasks.mjs')
1779
+ process.exitCode = await runGraphTasksCli(args)
1780
+
1781
+ break
1782
+ }
1783
+ case 'watch': {
1784
+ // n-cursor watch — one-shot DAG scan: audit queue + stale worktrees + needs-plan
1785
+ const { runGraphTasksCli } = await import('../scripts/dispatcher/graph-tasks.mjs')
1786
+ process.exitCode = await runGraphTasksCli(['watch', ...args])
1775
1787
 
1776
1788
  break
1777
1789
  }
@@ -1800,7 +1812,7 @@ try {
1800
1812
  default: {
1801
1813
  console.error(`❌ Невідома команда: ${command}`)
1802
1814
  console.error(
1803
- ` Очікується: (без аргументів) синхронізація правил, fix, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, coverage, coverage-fix, taze, start-check, fix-t0, change, release, skill, worktree, lint-ci, flow, trace, graph, docgen`
1815
+ ` Очікується: (без аргументів) синхронізація правил, fix, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, coverage, coverage-fix, taze, start-check, fix-t0, change, release, skill, worktree, lint-ci, flow, trace, graph, watch, docgen`
1804
1816
  )
1805
1817
  process.exitCode = 1
1806
1818
  }
package/lib/models.mjs CHANGED
@@ -55,8 +55,7 @@ export const CLOUD_MAX = env.N_CLOUD_MAX_MODEL ?? ''
55
55
  /**
56
56
  * Повертає перший непорожній model-id для запитаного тиру,
57
57
  * каскадно перевіряючи локальні тири, а тоді хмарний еквівалент.
58
- *
59
- * @param {'min'|'avg'|'max'} tier
58
+ * @param {'min'|'avg'|'max'} tier тир запитуваної моделі
60
59
  * @returns {string} provider/model-id або '' для pi-дефолту
61
60
  * @throws {TypeError} якщо tier невідомий
62
61
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "4.1.0",
3
+ "version": "4.1.1",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -24,6 +24,9 @@ Default-експорту немає. Окрім `run`, файл має **top-lev
24
24
  ### `run(ctx)`
25
25
 
26
26
  ```js
27
+ /**
28
+ *
29
+ */
27
30
  export function run(ctx) {
28
31
  return runStandardRule(import.meta.dirname, ctx)
29
32
  }
package/rules/bun/fix.mjs CHANGED
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -38,6 +38,9 @@ if (isRunAsCli(import.meta.url)) {
38
38
  ### `run(ctx)`
39
39
 
40
40
  ```js
41
+ /**
42
+ *
43
+ */
41
44
  export function run(ctx) {
42
45
  return runStandardRule(import.meta.dirname, ctx)
43
46
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
package/rules/ci4/fix.mjs CHANGED
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -96,6 +96,7 @@ export async function check(cwd = process.cwd()): Promise<number>
96
96
  1. Зовнішній runner (зазвичай CLI `n-cursor` або агрегатор правил) імпортує `check` і викликає його:
97
97
  ```js
98
98
  import { check } from '@nitra/cursor/npm/rules/ci4/js/marksman_config.mjs'
99
+
99
100
  const code = await check(process.cwd())
100
101
  process.exit(code)
101
102
  ```
@@ -163,7 +163,7 @@ export function run(ctx) {
163
163
 
164
164
  if (isRunAsCli(import.meta.url)) {
165
165
  // Standalone-ентрі: повний еквівалент `npx @nitra/cursor fix <id>`.
166
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
166
+ // eslint-disable-next-line n/no-process-exit
167
167
  process.exit(await runRuleCli(import.meta.dirname))
168
168
  }
169
169
  ```
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -167,6 +167,7 @@ if (isRunAsCli(import.meta.url)) {
167
167
  - **Програмно з інших скриптів:**
168
168
  ```js
169
169
  import { runLintDocker } from 'npm/rules/docker/lint/lint.mjs'
170
+
170
171
  const code = await runLintDocker() // 0 — OK, 1 — є зауваження/помилки
171
172
  ```
172
173
  - **Тести/допоміжний код:**
@@ -83,7 +83,7 @@ export function run(ctx) {
83
83
 
84
84
  ```js
85
85
  if (isRunAsCli(import.meta.url)) {
86
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
86
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
87
87
  process.exit(await runRuleCli(import.meta.dirname))
88
88
  }
89
89
  ```
@@ -177,6 +177,7 @@ $ bun npm/rules/efes/fix.mjs
177
177
 
178
178
  ```js
179
179
  import { run } from 'npm/rules/efes/fix.mjs'
180
+
180
181
  const code = await run() // 0 або 1
181
182
  ```
182
183
 
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
package/rules/ga/fix.mjs CHANGED
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -7,6 +7,6 @@ import { runLintGaCli } from '../lint/lint.mjs'
7
7
  * @param {string[] | undefined} _files ігнорується (whole-repo аналіз)
8
8
  * @returns {Promise<number>} exit code
9
9
  */
10
- export async function lint(_files) {
10
+ export function lint(_files) {
11
11
  return runLintGaCli()
12
12
  }
@@ -26,6 +26,9 @@ Default export відсутній. Інших named-експортів файл
26
26
  ### `run(ctx)`
27
27
 
28
28
  ```js
29
+ /**
30
+ *
31
+ */
29
32
  export function run(ctx) {
30
33
  return runStandardRule(import.meta.dirname, ctx)
31
34
  }
@@ -50,7 +53,7 @@ export function run(ctx) {
50
53
 
51
54
  ```js
52
55
  if (isRunAsCli(import.meta.url)) {
53
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
56
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
54
57
  process.exit(await runRuleCli(import.meta.dirname))
55
58
  }
56
59
  ```
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -163,6 +163,9 @@ Default-експорту **немає**. Усі допоміжні функці
163
163
  import { isGqlScanSourceFile, shouldSkipFileForGqlScan, sourceFileHasGqlTaggedTemplate } from './graphql-gql-scan.mjs'
164
164
  import { readFile } from 'node:fs/promises'
165
165
 
166
+ /**
167
+ *
168
+ */
166
169
  async function findFilesWithGqlTag(relativePaths) {
167
170
  const hits = []
168
171
  for (const rel of relativePaths) {
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -31,6 +31,9 @@
31
31
  ### `run(ctx)`
32
32
 
33
33
  ```js
34
+ /**
35
+ *
36
+ */
34
37
  export function run(ctx) {
35
38
  return runStandardRule(import.meta.dirname, ctx)
36
39
  }
@@ -49,7 +52,7 @@ export function run(ctx) {
49
52
 
50
53
  ```js
51
54
  if (isRunAsCli(import.meta.url)) {
52
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit
55
+ // eslint-disable-next-line n/no-process-exit
53
56
  process.exit(await runRuleCli(import.meta.dirname))
54
57
  }
55
58
  ```
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -195,6 +195,7 @@
195
195
 
196
196
  ```js
197
197
  import { check } from './npm/rules/image-avif/js/avif_generation.mjs'
198
+
198
199
  const exitCode = await check(process.cwd())
199
200
  process.exit(exitCode)
200
201
  ```
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -270,6 +270,10 @@ Set-константи:
270
270
 
271
271
  ```js
272
272
  import { SQL } from 'bun'
273
+
274
+ /**
275
+ *
276
+ */
273
277
  export async function handler(req) {
274
278
  const sql = new SQL(process.env.DATABASE_URL) // <-- порушення
275
279
  return sql`select 1`
@@ -280,6 +284,7 @@ Set-константи:
280
284
 
281
285
  ```js
282
286
  import { sql } from 'bun'
287
+
283
288
  const text = `select * from ${tableName}`
284
289
  sql.unsafe(text) // <-- порушення: немає // allow-unsafe: <reason>
285
290
  ```
@@ -309,6 +314,7 @@ Set-константи:
309
314
 
310
315
  ```js
311
316
  import { sql } from 'bun'
317
+
312
318
  await sql.end() // <-- порушення: немає // allow-pg-leftover: <reason>
313
319
  ```
314
320
 
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -152,6 +152,7 @@
152
152
 
153
153
  ```mjs
154
154
  import { check } from './utils_imports.mjs'
155
+
155
156
  const exitCode = await check()
156
157
  process.exit(exitCode)
157
158
  ```
@@ -54,6 +54,9 @@ export function run(ctx)
54
54
  ### `run(ctx)`
55
55
 
56
56
  ```js
57
+ /**
58
+ *
59
+ */
57
60
  export function run(ctx) {
58
61
  return runStandardRule(import.meta.dirname, ctx)
59
62
  }
@@ -79,7 +82,7 @@ if (isRunAsCli(import.meta.url)) {
79
82
  - **Дія:** виконує `await runRuleCli(import.meta.dirname)` — повний CLI-сценарій (config-loading, whitelist, summary), а потім завершує процес `process.exit(<exit-code>)` з тим самим кодом, що повернув `runRuleCli` (0 або 1) — це критично для CI/IDE, які орієнтуються на код виходу.
80
83
  - **Side effects:** завершення процесу (`process.exit`), вся I/O `runRuleCli`. Виклики `process.exit` тут спеціально дозволені директивою:
81
84
  ```js
82
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
85
+
83
86
  ```
84
87
 
85
88
  ## Залежності
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -29,6 +29,9 @@
29
29
  ### `run(ctx)`
30
30
 
31
31
  ```js
32
+ /**
33
+ *
34
+ */
32
35
  export function run(ctx) {
33
36
  return runStandardRule(import.meta.dirname, ctx)
34
37
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -252,6 +252,9 @@ const violationsGuard = findUnsafeMssqlInListMissingEmptyGuardInText(content, re
252
252
  Порушення:
253
253
 
254
254
  ```javascript
255
+ /**
256
+ *
257
+ */
255
258
  export async function handler() {
256
259
  const pool = new sql.ConnectionPool(config) // створення на кожен запит
257
260
  await pool.connect()
@@ -326,6 +329,9 @@ await sql.query`SELECT * FROM t WHERE id IN (${rawIds.map(Number)})`
326
329
  Порушення (`missing_guard` — немає `if (!ids.length) throw`):
327
330
 
328
331
  ```javascript
332
+ /**
333
+ *
334
+ */
329
335
  async function load(ids) {
330
336
  await sql.query`SELECT * FROM t WHERE id IN (${ids})`
331
337
  }
@@ -334,6 +340,9 @@ async function load(ids) {
334
340
  Не порушення:
335
341
 
336
342
  ```javascript
343
+ /**
344
+ *
345
+ */
337
346
  async function load(ids) {
338
347
  if (!ids.length) throw new Error('empty')
339
348
  await sql.query`SELECT * FROM t WHERE id IN (${ids})`
@@ -26,6 +26,9 @@
26
26
  ### `run(ctx)`
27
27
 
28
28
  ```js
29
+ /**
30
+ *
31
+ */
29
32
  export function run(ctx) {
30
33
  return runStandardRule(import.meta.dirname, ctx)
31
34
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -74,7 +74,8 @@ regex-перевірці підлягає лише сирий рядок із п
74
74
  Тип `EnvViolation` (внутрішній, описаний через JSDoc `@typedef`):
75
75
 
76
76
  ```js
77
- /** @typedef {{
77
+ /**
78
+ * @typedef {{
78
79
  * line: number,
79
80
  * name: string,
80
81
  * kind: 'process-env' | 'check-env-missing-checkEnv'
@@ -14,6 +14,7 @@ await new Promise(resolve => setTimeout(resolve, ms))
14
14
 
15
15
  ```js
16
16
  import { setTimeout as sleep } from 'node:timers/promises'
17
+
17
18
  await sleep(ms)
18
19
  ```
19
20
 
@@ -243,6 +244,9 @@ function walkAst(
243
244
  import { findPromiseSetTimeoutInText, isPromiseSetTimeoutScanSourceFile } from './promise-settimeout-scan.mjs'
244
245
  import { readFile } from 'node:fs/promises'
245
246
 
247
+ /**
248
+ *
249
+ */
246
250
  async function scanRepo(files) {
247
251
  const violations = []
248
252
  for (const relPath of files) {
@@ -26,6 +26,9 @@
26
26
  ### `run(ctx)`
27
27
 
28
28
  ```js
29
+ /**
30
+ *
31
+ */
29
32
  export function run(ctx) {
30
33
  return runStandardRule(import.meta.dirname, ctx)
31
34
  }
package/rules/k8s/fix.mjs CHANGED
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -22,6 +22,9 @@
22
22
  ### `run(ctx)`
23
23
 
24
24
  ```js
25
+ /**
26
+ *
27
+ */
25
28
  export function run(ctx) {
26
29
  return runStandardRule(import.meta.dirname, ctx)
27
30
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }
@@ -14,6 +14,6 @@ export function run(ctx) {
14
14
  if (isRunAsCli(import.meta.url)) {
15
15
  // Standalone: bun rules/<id>/fix.mjs — повний еквівалент `npx @nitra/cursor fix <id>`
16
16
  // (config-loading + whitelist + summary). Дві ролі fix.mjs: library (run) + standalone (main).
17
- // eslint-disable-next-line n/no-process-exit, unicorn/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
17
+ // eslint-disable-next-line n/no-process-exit -- standalone entry-point має повертати exit-code для CI/IDE
18
18
  process.exit(await runRuleCli(import.meta.dirname))
19
19
  }