@nitra/cursor 12.8.7 → 12.8.9

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 (111) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +1 -1
  3. package/rules/abie/main.mdc +9 -5
  4. package/rules/abie/policy/base_deployment_preem/base_deployment_preem.mdc +22 -0
  5. package/rules/abie/policy/clean_merged_ignore_branches/clean_merged_ignore_branches.mdc +19 -0
  6. package/rules/abie/policy/health_check_policy/health_check_policy.mdc +17 -0
  7. package/rules/abie/policy/http_route_base/http_route_base.mdc +9 -0
  8. package/rules/abie/policy/package_json_shared/package_json_shared.mdc +17 -0
  9. package/rules/adr/main.mdc +4 -0
  10. package/rules/adr/policy/settings_json/settings_json.mdc +7 -0
  11. package/rules/adr/policy/settings_local_json/settings_local_json.mdc +7 -0
  12. package/rules/bun/main.mdc +3 -4
  13. package/rules/bun/policy/bunfig/bunfig.mdc +12 -0
  14. package/rules/bun/policy/package_json/package_json.mdc +14 -0
  15. package/rules/capacitor/main.mdc +1 -3
  16. package/rules/capacitor/policy/package_json/package_json.mdc +9 -0
  17. package/rules/ci4/main.mdc +2 -0
  18. package/rules/ci4/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  19. package/rules/docker/main.mdc +1 -3
  20. package/rules/docker/policy/lint_docker_yml/lint_docker_yml.mdc +14 -0
  21. package/rules/efes/main.mdc +1 -1
  22. package/rules/efes/policy/package_json_shared/package_json_shared.mdc +30 -0
  23. package/rules/ga/main.mdc +15 -10
  24. package/rules/ga/policy/clean_ga_workflows/clean_ga_workflows.mdc +18 -0
  25. package/rules/ga/policy/clean_merged_branch/clean_merged_branch.mdc +22 -0
  26. package/rules/ga/policy/git_ai/git_ai.mdc +19 -0
  27. package/rules/ga/policy/lint_ga/lint_ga.mdc +21 -0
  28. package/rules/ga/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  29. package/rules/ga/policy/vscode_settings/vscode_settings.mdc +9 -0
  30. package/rules/ga/policy/workflow_common/workflow_common.mdc +18 -0
  31. package/rules/ga/policy/zizmor_yml/zizmor_yml.mdc +9 -0
  32. package/rules/graphql/main.mdc +2 -0
  33. package/rules/graphql/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  34. package/rules/hasura/main.mdc +1 -3
  35. package/rules/hasura/policy/svc_hl/svc_hl.mdc +15 -0
  36. package/rules/image-avif/main.mdc +1 -3
  37. package/rules/image-avif/policy/package_json/package_json.mdc +18 -0
  38. package/rules/image-compress/main.mdc +1 -1
  39. package/rules/image-compress/policy/package_json/package_json.mdc +13 -0
  40. package/rules/js/main.mdc +7 -6
  41. package/rules/js/policy/jscpd/jscpd.mdc +14 -0
  42. package/rules/js/policy/lint_js_yml/lint_js_yml.mdc +14 -0
  43. package/rules/js/policy/package_json/package_json.mdc +15 -0
  44. package/rules/js/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  45. package/rules/js-bun-db/main.mdc +1 -6
  46. package/rules/js-bun-db/policy/package_json/package_json.mdc +17 -0
  47. package/rules/js-bun-redis/main.mdc +2 -0
  48. package/rules/js-bun-redis/policy/package_json/package_json.mdc +11 -0
  49. package/rules/js-mssql/main.mdc +1 -1
  50. package/rules/js-mssql/policy/package_json/package_json.mdc +9 -0
  51. package/rules/js-run/main.mdc +5 -3
  52. package/rules/js-run/policy/configmap/configmap.mdc +31 -0
  53. package/rules/js-run/policy/jsconfig/jsconfig.mdc +25 -0
  54. package/rules/js-run/policy/package_json/package_json.mdc +38 -0
  55. package/rules/k8s/main.mdc +21 -13
  56. package/rules/k8s/policy/base_kustomization/base_kustomization.mdc +12 -0
  57. package/rules/k8s/policy/base_manifest/base_manifest.mdc +14 -0
  58. package/rules/k8s/policy/gateway/gateway.mdc +17 -0
  59. package/rules/k8s/policy/hasura_configmap/hasura_configmap.mdc +20 -0
  60. package/rules/k8s/policy/hasura_httproute/hasura_httproute.mdc +16 -0
  61. package/rules/k8s/policy/hpa_pdb/hpa_pdb.mdc +23 -0
  62. package/rules/k8s/policy/kustomization/kustomization.mdc +20 -0
  63. package/rules/k8s/policy/manifest/manifest.mdc +17 -0
  64. package/rules/k8s/policy/network_policy/network_policy.mdc +22 -0
  65. package/rules/k8s/policy/svc_hl_yaml/svc_hl_yaml.mdc +13 -0
  66. package/rules/k8s/policy/svc_yaml/svc_yaml.mdc +12 -0
  67. package/rules/nginx-default-tpl/main.mdc +4 -0
  68. package/rules/nginx-default-tpl/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  69. package/rules/nginx-default-tpl/policy/vscode_settings/vscode_settings.mdc +15 -0
  70. package/rules/npm-module/main.mdc +6 -3
  71. package/rules/npm-module/policy/emit_types_config/emit_types_config.mdc +40 -0
  72. package/rules/npm-module/policy/npm_package_json/npm_package_json.mdc +50 -0
  73. package/rules/npm-module/policy/root_package_json/root_package_json.mdc +37 -0
  74. package/rules/php/main.mdc +1 -3
  75. package/rules/php/policy/lint_php_yml/lint_php_yml.mdc +21 -0
  76. package/rules/python/main.mdc +3 -4
  77. package/rules/python/policy/lint_python_yml/lint_python_yml.mdc +12 -0
  78. package/rules/python/policy/pyproject_toml/pyproject_toml.mdc +13 -0
  79. package/rules/rego/main.mdc +4 -0
  80. package/rules/rego/policy/vscode_extensions/vscode_extensions.mdc +11 -0
  81. package/rules/rego/policy/vscode_settings/vscode_settings.mdc +19 -0
  82. package/rules/rust/main.mdc +2 -2
  83. package/rules/rust/policy/lint_rust_yml/lint_rust_yml.mdc +12 -0
  84. package/rules/rust/policy/vscode_extensions/vscode_extensions.mdc +9 -0
  85. package/rules/security/main.mdc +3 -2
  86. package/rules/security/policy/lint_security_yml/lint_security_yml.mdc +7 -0
  87. package/rules/security/policy/package_json/package_json.mdc +7 -0
  88. package/rules/style/main.mdc +6 -5
  89. package/rules/style/policy/lint_style_yml/lint_style_yml.mdc +13 -0
  90. package/rules/style/policy/package_json/package_json.mdc +18 -0
  91. package/rules/style/policy/vscode_extensions/vscode_extensions.mdc +13 -0
  92. package/rules/style/policy/vscode_settings/vscode_settings.mdc +19 -0
  93. package/rules/tauri/main.mdc +1 -3
  94. package/rules/tauri/policy/vscode_extensions/vscode_extensions.mdc +21 -0
  95. package/rules/test/main.mdc +1 -3
  96. package/rules/test/policy/package_json/package_json.mdc +16 -0
  97. package/rules/text/main.mdc +13 -7
  98. package/rules/text/policy/cspell/cspell.mdc +34 -0
  99. package/rules/text/policy/lint_text/lint_text.mdc +19 -0
  100. package/rules/text/policy/markdownlint/markdownlint.mdc +38 -0
  101. package/rules/text/policy/oxfmtrc/oxfmtrc.mdc +11 -0
  102. package/rules/text/policy/package_json/package_json.mdc +33 -0
  103. package/rules/text/policy/vscode_extensions/vscode_extensions.mdc +13 -0
  104. package/rules/text/policy/vscode_settings/vscode_settings.mdc +13 -0
  105. package/rules/vue/main.mdc +1 -3
  106. package/rules/vue/policy/package_json/package_json.mdc +30 -0
  107. package/scripts/lib/docs/index.md +36 -36
  108. package/scripts/lib/docs/rule-meta.md +10 -9
  109. package/scripts/lib/docs/run-lint.md +8 -8
  110. package/scripts/lib/rule-meta.mjs +2 -1
  111. package/scripts/lib/run-lint.mjs +39 -1
@@ -6,40 +6,40 @@ resource: npm/scripts/lib/
6
6
 
7
7
  # npm/scripts/lib
8
8
 
9
- | Файл | Тип |
10
- | --------------------------------------------------------------------------- | --------- |
11
- | [assert-project-root.mjs](assert-project-root.md) | JS Module |
12
- | [changed-files.mjs](changed-files.md) | JS Module |
13
- | [check-mdc-template-refs.mjs](check-mdc-template-refs.md) | JS Module |
14
- | [check-reporter.mjs](check-reporter.md) | JS Module |
15
- | [diff-added-lines.mjs](diff-added-lines.md) | JS Module |
9
+ | Файл | Тип |
10
+ |---|---|
11
+ | [assert-project-root.mjs](assert-project-root.md) | JS Module |
12
+ | [changed-files.mjs](changed-files.md) | JS Module |
13
+ | [check-mdc-template-refs.mjs](check-mdc-template-refs.md) | JS Module |
14
+ | [check-reporter.mjs](check-reporter.md) | JS Module |
15
+ | [diff-added-lines.mjs](diff-added-lines.md) | JS Module |
16
16
  | [discover-check-rules-from-cursor.mjs](discover-check-rules-from-cursor.md) | JS Module |
17
- | [discover-checkable-rules.mjs](discover-checkable-rules.md) | JS Module |
18
- | [ensure-tool.mjs](ensure-tool.md) | JS Module |
19
- | [generated-markdown.mjs](generated-markdown.md) | JS Module |
20
- | [gha-workflow.mjs](gha-workflow.md) | JS Module |
21
- | [inline-template-links.mjs](inline-template-links.md) | JS Module |
22
- | [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
23
- | [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
24
- | [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
25
- | [mirror-parity.mjs](mirror-parity.md) | JS Module |
26
- | [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md) | JS Module |
27
- | [resolve-target-files.mjs](resolve-target-files.md) | JS Module |
28
- | [root-notice.mjs](root-notice.md) | JS Module |
29
- | [rule-meta-helpers.mjs](rule-meta-helpers.md) | JS Module |
30
- | [rule-meta.mjs](rule-meta.md) | JS Module |
31
- | [rule-predicates.mjs](rule-predicates.md) | JS Module |
32
- | [run-conftest-batch.mjs](run-conftest-batch.md) | JS Module |
33
- | [run-lint-step.mjs](run-lint-step.md) | JS Module |
34
- | [run-lint.mjs](run-lint.md) | JS Module |
35
- | [run-rule-cli.mjs](run-rule-cli.md) | JS Module |
36
- | [run-rule.mjs](run-rule.md) | JS Module |
37
- | [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
38
- | [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
39
- | [skill-meta.mjs](skill-meta.md) | JS Module |
40
- | [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
41
- | [template.mjs](template.md) | JS Module |
42
- | [timing-summary.mjs](timing-summary.md) | JS Module |
43
- | [workspaces.mjs](workspaces.md) | JS Module |
44
- | [worktree-notice.mjs](worktree-notice.md) | JS Module |
45
- | [worktree.mjs](worktree.md) | JS Module |
17
+ | [discover-checkable-rules.mjs](discover-checkable-rules.md) | JS Module |
18
+ | [ensure-tool.mjs](ensure-tool.md) | JS Module |
19
+ | [generated-markdown.mjs](generated-markdown.md) | JS Module |
20
+ | [gha-workflow.mjs](gha-workflow.md) | JS Module |
21
+ | [inline-template-links.mjs](inline-template-links.md) | JS Module |
22
+ | [list-project-rules-mdc.mjs](list-project-rules-mdc.md) | JS Module |
23
+ | [list-rule-ids.mjs](list-rule-ids.md) | JS Module |
24
+ | [load-cursor-config.mjs](load-cursor-config.md) | JS Module |
25
+ | [mirror-parity.mjs](mirror-parity.md) | JS Module |
26
+ | [read-n-cursor-config-lite.mjs](read-n-cursor-config-lite.md) | JS Module |
27
+ | [resolve-target-files.mjs](resolve-target-files.md) | JS Module |
28
+ | [root-notice.mjs](root-notice.md) | JS Module |
29
+ | [rule-meta-helpers.mjs](rule-meta-helpers.md) | JS Module |
30
+ | [rule-meta.mjs](rule-meta.md) | JS Module |
31
+ | [rule-predicates.mjs](rule-predicates.md) | JS Module |
32
+ | [run-conftest-batch.mjs](run-conftest-batch.md) | JS Module |
33
+ | [run-lint-step.mjs](run-lint-step.md) | JS Module |
34
+ | [run-lint.mjs](run-lint.md) | JS Module |
35
+ | [run-rule-cli.mjs](run-rule-cli.md) | JS Module |
36
+ | [run-rule.mjs](run-rule.md) | JS Module |
37
+ | [run-standard-lint.mjs](run-standard-lint.md) | JS Module |
38
+ | [run-standard-rule.mjs](run-standard-rule.md) | JS Module |
39
+ | [skill-meta.mjs](skill-meta.md) | JS Module |
40
+ | [sync-gitignore-worktree.mjs](sync-gitignore-worktree.md) | JS Module |
41
+ | [template.mjs](template.md) | JS Module |
42
+ | [timing-summary.mjs](timing-summary.md) | JS Module |
43
+ | [workspaces.mjs](workspaces.md) | JS Module |
44
+ | [worktree-notice.mjs](worktree-notice.md) | JS Module |
45
+ | [worktree.mjs](worktree.md) | JS Module |
@@ -3,29 +3,30 @@ type: JS Module
3
3
  title: rule-meta.mjs
4
4
  resource: npm/scripts/lib/rule-meta.mjs
5
5
  docgen:
6
- crc: 8eca71d2
6
+ crc: dd8fe34a
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
11
  ## Огляд
12
12
 
13
- Файл зчитує метадані правил з `npm/rules/<id>/main.json`. Він нормалізує специфікації активації (`auto`) та області застосування (`lint`). Специфікація `main.json.auto` може мати чотири форми: константу `RULE_ALWAYS` ("завжди"), масив залежних правил, об'єкт з шаблоном `glob` або об'єкт з предикатом. Це забезпечує механізм для визначення умов активації правила на основі конфігурації `main.json`.
13
+ Парсер метаданих правил з `npm/rules/<id>/main.json` інтерпретує специфікації активації (`auto`) та області дії (`lint`). Він нормалізує логіку, визначену у `main.json.auto`, яка може бути константою `RULE_ALWAYS="завжди"`, списком залежностей, об'єктом з шаблоном `glob`, або предикатом. Код лише зчитує дані та не виконує операцій з файловою системою чи базами даних. При виникненні помилок він перехоплює їх, повертаючи безпечне значення замість винятків.
14
14
 
15
15
  ## Поведінка
16
16
 
17
17
  RULE_ALWAYS — Константа, що позначає безумовну активацію правила.
18
18
  parseRuleAutoSpec — Нормалізує значення поля `auto` з `main.json` у дискриміновану специфікацію активації правила.
19
- parseRuleLintSpec — Нормалізує значення поля `lint` з `main.json` у специфікацію області застосування детектора.
20
- readRuleMetaRaw — Зчитує та парсить вміст `main.json` з каталогу правила, повертаючи його як об'єкт або `null` у разі помилки чи відсутності файлу.
19
+ parseRuleLintSpec — Нормалізує значення поля `lint` з `main.json` у специфікацію області дії детектора.
20
+ readRuleMetaRaw — Зчитує та парсить вміст `main.json` з каталогу правила, повертаючи його як об'єкт або `null`.
21
21
 
22
22
  ## Публічний API
23
23
 
24
- RULE_ALWAYS — позначка для безумовної активації.
25
- parseRuleAutoSpec — перетворює налаштування автоматичного визначення правил з `main.json` у структурований формат.
26
- parseRuleLintSpec — перетворює налаштування лінтера з `main.json` у визначення області дії детектора.
27
- "per-file" — визначає, що детектор аналізує зміни на рівні окремих файлів (порівнює відмінності з оригіналом).
28
- "full" — визначає, що детектор аналізує весь проєкт одночасно (активується лише при використанні прапорця `--full` або в CI).
24
+ RULE_ALWAYS — константа, що вказує на безумовну активацію.
25
+ parseRuleAutoSpec — перетворює налаштування автоматичного сканування з `main.json` у структурований формат.
26
+ parseRuleLintSpec — перетворює налаштування лінтування з `main.json` у визначення області дії детектора.
27
+ "per-file" — визначає, що детектор аналізує лише змінені файли (порівнюючи їх з оригіналом).
28
+ "full" — визначає, що детектор сканує весь репозиторій; у режимі змін тригериться лише при перетині змінених файлів з шаблоном `auto.glob`.
29
+ Об'єктна форма `{scope, ci}` скасована — оскільки режим CI (`--read-only --full`) сканує весь репозиторій, окремі перевизначення CI для кожного правила не потрібні.
29
30
  readRuleMetaRaw — зчитує та розбирає метадані одного правила з `main.json`.
30
31
 
31
32
  ## Гарантії поведінки
@@ -3,27 +3,27 @@ type: JS Module
3
3
  title: run-lint.mjs
4
4
  resource: npm/scripts/lib/run-lint.mjs
5
5
  docgen:
6
- crc: 24827b04
6
+ crc: 7d8f3637
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  ---
10
10
 
11
11
  ## Огляд
12
12
 
13
- Модуль ініціалізує та керує процесом лінтування коду. Він вибирає та сортує набір правил для перевірки, використовуючи конфігурації `meta.json` та `.n-cursor.json`. Публічна функція `selectLintRules` виконує вибір правил. Публічна функція `runLint` ініціює повний цикл лінтування, який може включати перевірку змінених файлів або всього репозиторію.
13
+ Модуль ініціалізує та керує процесом лінтування коду. Він визначає набір правил лінтування, спираючись на конфігурацію, описану в `meta.json`, та прапорець `full`, використовуючи активні правила з `.n-cursor.json`. Після визначення правил, він запускає лінтер-оркестрацію для виконання лінтування по всьому репозиторію або в режимі дельти. Модуль підтримує автоматичне форматування коду за допомогою `oxfmt`.
14
14
 
15
15
  ## Поведінка
16
16
 
17
- selectLintRules вибирає і алфавітно сортує ідентифікатори правил для лінтування, ґрунтуючись на наявності в конфігурації та заданому обсязі перевірки.
18
- runLint запускає повну оркестрацію лінтування, виконуючи перевірку змінених файлів або весь репозиторій, залежно від параметрів, і може включати фази конформності та форматування.
17
+ selectLintRules вибирає і відсортовує ідентифікатори правил для лінтування на основі їхньої конфігурації лінту та прапорця `full`, враховуючи активні правила з `.n-cursor.json`.
18
+ runLint запускає лінтер-оркестрацію, виконуючи лінтування в режимі дельти або по всьому репозиторію, залежно від прапорця `full`, і може виконувати форматування за допомогою `oxfmt` у режимі фіксації.
19
19
 
20
20
  ## Публічний API
21
21
 
22
- selectLintRules — обирає ідентифікатори правил для контексту, розташовуючи їх в алфавітному порядку.
22
+ selectLintRules — вибирає ідентифікатори правил для контексту, розташовуючи їх в алфавітному порядку.
23
23
  runLint — ініціює процес лінтування.
24
- full — сканує весь репозиторій, порівнюючи його з початковим станом.
25
- readOnly — лише виявляє проблеми, не вносячи змін, порівнюючи з початковим станом.
26
- rules — виконує повне сканування лише для вказаних правил у заданому обсязі.
24
+ full — сканує весь репозиторій, порівнюючи його з базовою версією.
25
+ readOnly — лише виявляє проблеми без внесення змін, порівнюючи з базовою версією.
26
+ rules — виконує повне сканування лише для заданого набору правил.
27
27
 
28
28
  ## Гарантії поведінки
29
29
 
@@ -54,7 +54,8 @@ const LINT_SCOPES = new Set(['per-file', 'full'])
54
54
  /**
55
55
  * Нормалізує значення `main.json.lint` у scope детектора.
56
56
  * - `"per-file"` — детектор декомпозується на змінені файли (дельта vs origin);
57
- * - `"full"` — нероздільно крос-файловий (лише `--full` / CI).
57
+ * - `"full"` — крос-файловий: у `--full` ганяє весь репо; у delta-режимі тригериться
58
+ * лише якщо змінені файли перетинаються з `auto.glob` правила (whole-repo scan).
58
59
  * Об'єктна форма `{scope, ci}` скасована: CI=`--read-only --full` ганяє все повністю,
59
60
  * тож per-rule CI-override не потрібен (spec 2026-06-14-lint-rule-consolidation §3-А).
60
61
  * @param {unknown} value значення поля `lint`
@@ -5,7 +5,9 @@ import { fileURLToPath } from 'node:url'
5
5
  import { cwd as processCwd } from 'node:process'
6
6
  import { spawnSync } from 'node:child_process'
7
7
 
8
- import { parseRuleLintSpec, readRuleMetaRaw } from './rule-meta.mjs'
8
+ import picomatch from 'picomatch'
9
+
10
+ import { parseRuleAutoSpec, parseRuleLintSpec, readRuleMetaRaw } from './rule-meta.mjs'
9
11
  import { collectChangedFilesSince, resolveChangedBase } from './changed-files.mjs'
10
12
  import { resolveCmd } from '../utils/resolve-cmd.mjs'
11
13
  import { isRuleEnabled, readNCursorConfigLite } from './read-n-cursor-config-lite.mjs'
@@ -78,6 +80,30 @@ export function selectLintRules(metaById, full, enabledRuleIds) {
78
80
  return out.toSorted((a, b) => a.localeCompare(b))
79
81
  }
80
82
 
83
+ /**
84
+ * Визначає `full`-scope правила для запуску у delta-режимі.
85
+ * Правило включається, якщо хоча б один зі змінених файлів відповідає `auto.glob` правила.
86
+ * Предикат-auto (repo-level сигнал, не file-level) — пропускається.
87
+ * @param {Record<string, Record<string, unknown>>} metaById
88
+ * @param {string[]} changed змінені файли (posix-відносні від кореня)
89
+ * @param {string[]} enabledRuleIds активні rule-id
90
+ * @returns {string[]} відсортовані id
91
+ */
92
+ function selectFullRulesForDelta(metaById, changed, enabledRuleIds) {
93
+ if (changed.length === 0) return []
94
+ const enabled = new Set(enabledRuleIds)
95
+ const out = []
96
+ for (const [id, raw] of Object.entries(metaById)) {
97
+ if (!enabled.has(id)) continue
98
+ if (parseRuleLintSpec(raw?.lint) !== 'full') continue
99
+ const autoSpec = parseRuleAutoSpec(raw?.auto)
100
+ if (!autoSpec || !('glob' in autoSpec)) continue
101
+ const isMatch = picomatch(autoSpec.glob, { dot: true })
102
+ if (changed.some(f => isMatch(f))) out.push(id)
103
+ }
104
+ return out.toSorted((a, b) => a.localeCompare(b))
105
+ }
106
+
81
107
  /**
82
108
  * Активні правила для unscoped linter-фази. `.n-cursor.json` — єдине джерело
83
109
  * whitelist/disable, `meta.json#lint` нижче використовується лише як scope (`per-file`/`full`).
@@ -244,6 +270,18 @@ export async function runLint(opts = {}) {
244
270
  if (perFile.stop) return perFile.code
245
271
  let worst = perFile.code
246
272
 
273
+ // Delta-режим: `full`-scope правила, чиї glob-и перетинаються з changed.
274
+ // Запускаємо з `changed=undefined` (whole-repo scan як зазвичай) — так уникаємо
275
+ // прогону docker/ga/k8s… коли жоден їхній файл не змінився.
276
+ if (!full && changed.length > 0) {
277
+ const fullIds = selectFullRulesForDelta(metaById, changed, enabledRuleIds)
278
+ if (fullIds.length > 0) {
279
+ const fullResult = await runPerFileRules(fullIds, { rulesDir, changed: undefined, cwd, readOnly, metaById, log })
280
+ if (fullResult.stop) return fullResult.code
281
+ if (fullResult.code !== 0) worst = fullResult.code
282
+ }
283
+ }
284
+
247
285
  // Конформність-фаза: whole-repo, лише у `--full`. Кастомний rulesDir (юніт-тести
248
286
  // селектора) — реальний пакет недоступний, тож пропускаємо.
249
287
  if (full && opts.rulesDir === undefined) {