@nitra/cursor 3.27.0 → 3.28.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 (125) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +1 -1
  3. package/rules/abie/js/applies.mjs +1 -5
  4. package/rules/abie/js/env_dns.mjs +1 -9
  5. package/rules/abie/js/firebase_hosting.mjs +1 -5
  6. package/rules/abie/js/hc_pairing.mjs +1 -8
  7. package/rules/abie/js/ua_http_route.mjs +1 -10
  8. package/rules/abie/js/ua_node_selector.mjs +1 -8
  9. package/rules/adr/js/hooks.mjs +1 -20
  10. package/rules/bun/js/layout.mjs +1 -19
  11. package/rules/capacitor/js/platforms.mjs +1 -23
  12. package/rules/changelog/js/consistency.mjs +1 -29
  13. package/rules/ci4/js/marksman_config.mjs +1 -19
  14. package/rules/docker/js/lint.mjs +1 -34
  15. package/rules/ga/docs/fix.md +4 -4
  16. package/rules/ga/js/docs/lint.md +3 -3
  17. package/rules/ga/js/docs/workflows.md +14 -14
  18. package/rules/ga/js/workflows.mjs +1 -16
  19. package/rules/ga/lint/docs/lint.md +9 -9
  20. package/rules/graphql/js/tooling.mjs +1 -9
  21. package/rules/hasura/js/internal_urls.mjs +1 -24
  22. package/rules/image-avif/js/avif_generation.mjs +1 -27
  23. package/rules/image-compress/js/package_setup.mjs +1 -18
  24. package/rules/js-bun-db/js/safety.mjs +1 -31
  25. package/rules/js-bun-redis/js/imports.mjs +1 -12
  26. package/rules/js-lint/js/docs/lint-findings.md +30 -0
  27. package/rules/js-lint/js/lint-findings.mjs +1 -7
  28. package/rules/js-lint/js/lint.mjs +1 -10
  29. package/rules/js-lint/js/tooling.mjs +1 -13
  30. package/rules/js-lint/js/utils_imports.mjs +1 -18
  31. package/rules/js-lint-ci/js/lint.mjs +1 -6
  32. package/rules/js-mssql/js/deps.mjs +1 -10
  33. package/rules/js-run/js/runtime.mjs +1 -37
  34. package/rules/js-run/lib/docs/temporal-scan.md +25 -0
  35. package/rules/k8s/js/manifests.mjs +1 -137
  36. package/rules/nginx-default-tpl/js/template.mjs +1 -18
  37. package/rules/npm-module/js/docs/header_doc_pointer.md +25 -0
  38. package/rules/npm-module/js/header_doc_pointer.mjs +82 -0
  39. package/rules/npm-module/js/package_structure.mjs +1 -28
  40. package/rules/npm-module/js/rule_meta.mjs +1 -10
  41. package/rules/npm-module/js/skill_meta.mjs +1 -13
  42. package/rules/php/js/tooling.mjs +1 -11
  43. package/rules/python/js/applies.mjs +1 -8
  44. package/rules/python/js/tooling.mjs +1 -21
  45. package/rules/rego/js/applies.mjs +1 -11
  46. package/rules/rust/js/applies.mjs +1 -7
  47. package/rules/security/js/sample_secret.mjs +1 -28
  48. package/rules/security/js/trufflehog.mjs +1 -8
  49. package/rules/style-lint/js/lint.mjs +1 -5
  50. package/rules/style-lint/js/tooling.mjs +1 -19
  51. package/rules/tauri/js/cargo_mutants_config.mjs +1 -20
  52. package/rules/tauri/js/tooling.mjs +1 -21
  53. package/rules/test/js/cargo_mutants_config.mjs +1 -12
  54. package/rules/test/js/location.mjs +1 -9
  55. package/rules/test/js/no-process-chdir.mjs +1 -21
  56. package/rules/test/js/no-relative-fs-path.mjs +1 -23
  57. package/rules/test/js/stryker_config.mjs +4 -25
  58. package/rules/test/js/vitest-config-pool-forks.mjs +1 -17
  59. package/rules/text/js/forbidden-prettier.mjs +1 -10
  60. package/rules/text/js/formatting.mjs +1 -31
  61. package/rules/vue/js/packages.mjs +1 -24
  62. package/scripts/docs/coverage-fix-extract.md +32 -0
  63. package/scripts/docs/lint-cli.md +25 -0
  64. package/scripts/docs/post-tool-use-fix.md +27 -0
  65. package/scripts/docs/rename-yaml-extensions.md +36 -0
  66. package/scripts/docs/skills-cli.md +35 -0
  67. package/scripts/docs/sync-claude-config.md +52 -0
  68. package/scripts/docs/sync-setup-bun-deps-action.md +26 -0
  69. package/scripts/docs/upgrade-nitra-cursor-and-install.md +29 -0
  70. package/scripts/docs/worktree-cli.md +46 -0
  71. package/scripts/lib/docs/assert-project-root.md +28 -0
  72. package/scripts/lib/docs/diff-added-lines.md +34 -0
  73. package/scripts/lib/docs/read-n-cursor-config-lite.md +28 -0
  74. package/scripts/lib/docs/resolve-target-files.md +34 -0
  75. package/scripts/lib/docs/root-notice.md +28 -0
  76. package/scripts/lib/docs/rule-meta-helpers.md +34 -0
  77. package/scripts/lib/docs/rule-meta.md +34 -0
  78. package/scripts/lib/docs/rule-predicates.md +30 -0
  79. package/scripts/lib/docs/run-conftest-batch.md +26 -0
  80. package/scripts/lib/docs/run-lint-step.md +25 -0
  81. package/scripts/lib/docs/run-rule-cli.md +27 -0
  82. package/scripts/lib/docs/run-rule.md +32 -0
  83. package/scripts/lib/docs/run-standard-lint.md +22 -0
  84. package/scripts/lib/docs/run-standard-rule.md +24 -0
  85. package/scripts/lib/docs/skill-meta.md +31 -0
  86. package/scripts/lib/docs/sync-gitignore-worktree.md +31 -0
  87. package/scripts/lib/docs/template.md +40 -0
  88. package/scripts/lib/docs/timing-summary.md +24 -0
  89. package/scripts/lib/docs/workspaces.md +30 -0
  90. package/scripts/lib/docs/worktree-notice.md +27 -0
  91. package/scripts/lib/docs/worktree.md +38 -0
  92. package/scripts/utils/docs/ast-scan-utils.md +50 -0
  93. package/scripts/utils/docs/ensure-gitignore-entries.md +28 -0
  94. package/scripts/utils/docs/find-package-json-paths.md +26 -0
  95. package/scripts/utils/docs/lock-cache-dir.md +25 -0
  96. package/scripts/utils/docs/pass.md +25 -0
  97. package/scripts/utils/docs/resolve-cargo-manifest.md +23 -0
  98. package/scripts/utils/docs/resolve-cmd.md +29 -0
  99. package/scripts/utils/docs/resolve-js-root.md +25 -0
  100. package/scripts/utils/docs/test-helpers.md +36 -0
  101. package/scripts/utils/docs/walk-cache.md +27 -0
  102. package/scripts/utils/docs/walkDir.md +32 -0
  103. package/scripts/utils/docs/with-lock.md +25 -0
  104. package/scripts/utils/docs/worktree-fingerprint.md +27 -0
  105. package/skills/docgen/js/docgen-batch.mjs +95 -0
  106. package/skills/docgen/js/docgen-extract.mjs +33 -18
  107. package/skills/docgen/js/docgen-gen.mjs +125 -98
  108. package/skills/docgen/js/docgen-ignore.mjs +1 -6
  109. package/skills/docgen/js/docgen-prompts.mjs +33 -22
  110. package/skills/docgen/js/docgen-scan.mjs +1 -8
  111. package/skills/docgen/js/docs/docgen-extract.md +28 -0
  112. package/skills/docgen/js/docs/docgen-gen.md +41 -0
  113. package/skills/docgen/js/docs/docgen-ignore.md +24 -0
  114. package/skills/docgen/js/docs/docgen-prompts.md +24 -0
  115. package/skills/docgen/js/docs/docgen-scan.md +48 -0
  116. package/skills/fix/js/docs/llm-worker.md +27 -0
  117. package/skills/fix/js/docs/orchestrator.md +32 -0
  118. package/skills/fix/js/docs/t0.md +29 -0
  119. package/skills/fix/js/llm-worker.mjs +64 -29
  120. package/skills/fix/js/orchestrator.mjs +45 -54
  121. package/skills/fix/js/t0.mjs +16 -32
  122. package/skills/start-check/js/check.mjs +1 -16
  123. package/skills/start-check/js/docs/check.md +34 -0
  124. package/skills/taze/js/diff.mjs +1 -15
  125. package/skills/taze/js/docs/diff.md +33 -0
@@ -0,0 +1,40 @@
1
+ # template.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл обробляє шаблони для певних напрямків, збираючи їх у єдину структуру, яка індексується за назвою цільового файлу. Він повертає найбільш відповідний шаблон з `snippet/`, `deny/` або `contains/`, розпізнаний за розширенням, для кожного цільового файлу. Це забезпечує можливість динамічної генерації контенту на основі шаблонів, визначених для різних областей застосунку.
6
+
7
+ ## Поведінка
8
+
9
+ - `parseByExt`: Парсує файл на основі його розширення, повертаючи JS об'єкт для структурованих форматів або рядок для тексту.
10
+ - `checkSnippet`: Перевіряє, чи всі значення у фрагменті збігаються з відповідними шляхами у фактичному значенні, з урахуванням масивів.
11
+ - `checkDeny`: Перевіряє, чи містить фактичне значення будь-який шлях, вказаний у дереві заборони.
12
+ - `checkContains`: Перевіряє, чи містить фактичне значення будь-який шлях, вказаний у дереві обов'язкових підрядків.
13
+ - `checkTextSubset`: Перевіряє, чи містять всі рядки у шаблоні фактичне значення.
14
+ - `loadTemplate`: Зчитує файли з каталогу шаблонів, парсує їх і повертає об'єкт, індексований за назвою цілі.
15
+ - `resolveConcernTemplateData`: Визначає відповідний шаблон для заданого «concern», використовуючи `target.json`.
16
+
17
+ ## Публічний API
18
+
19
+ - parseByExt: Розбирає вміст файлу за розширенням, повертаючи JS об'єкт для структурованих форматів або рядок для тексту.
20
+ - checkSnippet: Перевіряє відповідність фрагмента фактичному контенту: кожна гілка фрагмента повинна відповідати гілці в фактичному контенті. Масиви в фрагменті повинні бути присутніми у фактичному масиві. Повертає масив повідомлень про порушення.
21
+ - checkDeny: Проходить по дереву заборон, повертаючи повідомлення про порушення для будь-якої гілки, яка існує в фактичному контенті, з причиною у вигляді рядка з листом заборони.
22
+ - checkContains: Перевіряє, чи містять всі рядки з масиву `contains` в якості підрядків відповідні гілки в `actual` (рядок листка).
23
+ - checkTextSubset: Перевіряє текстові цілі (наприклад, .stylelintignore): кожна не порожня, не коментарна лінія в шаблоні повинна з'являтися (з видаленими пробілами) у фактичному контенті.
24
+ - loadTemplate: Завантажує шаблон.
25
+ - resolveConcernTemplateData: Визначає, який шаблон [`<ціль>`](target) передати для заданого контексту, на основі файлу `target.json`. Для цілей `single` - використову
26
+
27
+ ## Гарантії поведінки
28
+
29
+ - Файл читає шаблон для заданої області відповідальності та повертає об'єднану структуру, індексовану за основою імені файлу цілі.
30
+ - Для кожної цілі повертається один із файлів snippet/, deny/ або contains/, розібраний у нативному форматі за розширенням.
31
+ - Функція `parseByExt` повертає об'єднану структуру.
32
+ - Функція `checkSnippet` повертає результат перевірки snippet/.
33
+ - Функція `checkDeny` повертає результат перевірки deny/.
34
+ - Функція `checkContains` повертає результат перевірки contains/.
35
+ - Функція `checkTextSubset` повертає результат перевірки підмножини тексту.
36
+ - Функція `loadTemplate` завантажує шаблон.
37
+ - Функція `resolveConcernTemplateData` розв'язує дані шаблону для заданої області відповідальності.
38
+ - Шляхи `node_modules` ігноруються.
39
+ - Файл є read-only.
40
+ - Кешування відсутнє.
@@ -0,0 +1,24 @@
1
+ # timing-summary.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл генерує табличне резюме часу виконання для команд `fix` та `lint`, які використовуються в orchestrator. Він підсумовує час виконання окремих правил та скриптів linting, надаючи інформацію для аналізу продуктивності. Результат представлений у вигляді рядка, який можна вивести для відображення користувачеві.
6
+
7
+ ## Поведінка
8
+
9
+ formatDurationMs: Перетворює мілісекунди на рядок у форматі `<ціла>.<десята>s`.
10
+ formatTimingSummary: Формує таблицю-резюме часу виконання з масиву записів, виводячи їх у текстовому форматі.
11
+
12
+ ## Публічний API
13
+
14
+ - formatDurationMs — Форматує значення тривалості в форматі `<сек>.<десята>с`. Округлення виконується вниз (floor), щоб забезпечити консистентність результатів незалежно від платформи.
15
+ - formatTimingSummary — Створює багаторядковий текст у форматі таблиці-резюме для виведення в консоль (stdout).
16
+
17
+ ## Гарантії поведінки
18
+
19
+ ❌ Якщо `ok` дорівнює `false`, повертає `null`.
20
+ ❌ Якщо час виконання перевищує 5 секунд, повертає `null`.
21
+ Повертає рядок, що містить таблицю з часом виконання.
22
+ Час виконання виражається у форматі `<ціла>.<десята>s`.
23
+ Повертає рядок з символом `\n` в кінці.
24
+ Не використовує кешування.
@@ -0,0 +1,30 @@
1
+ # workspaces.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл визначає список кореневих каталогів пакетів у монорепо, використовуючи конфігурацію `workspaces` з `package.json`. Він використовується скриптами перевірки монорепо для ідентифікації всіх проектів, які потрібно перевірити. Результат повертається для подальшого використання в процесах перевірки та аналізу.
6
+
7
+ ## Поведінка
8
+
9
+ `isIgnoredWorkspaceRoot`: Перевіряє, чи слід ігнорувати каталог як корінь воркспейсу.
10
+ `normalizeWorkspacePattern`: Нормалізує воркспейс-патерн до POSIX-формату, видаляючи хвостові `/`.
11
+ `normalizeWorkspacePatterns`: Перетворює значення `workspaces` в масив воркспейс-патернів.
12
+ `getMonorepoPackageRootDirs`: Збирає список коренів пакетів воркспейсу з `package.json`.
13
+ `WORKSPACE_GLOB_IGNORE`: Ігнорує каталоги `node_modules`, `.git`, `.venv` та `venv`.
14
+
15
+ ## Публічний API
16
+
17
+ - WORKSPACE_GLOB_IGNORE — Ігнорує шаблони workspace, що містять `*`, як визначено в `rules/changelog/js/consistency/package-manifest.mjs`.
18
+ - isIgnoredWorkspaceRoot — Визначає, чи слід виключити каталог з списку коренів workspace (не враховує `.`).
19
+ - normalizeWorkspacePatterns — Перетворює поле `workspaces` з `package.json` на масив шляхів або glob-шаблонів.
20
+ - getMonorepoPackageRootDirs — Повертає список кореневих каталогів пакетів, включаючи корінь репозиторію та всі пакети, визначені в `workspaces`.
21
+
22
+ ## Гарантії поведінки
23
+
24
+ - Повертає порожній список каталогів, якщо не знайдено жодного `package.json` у кореневому каталозі або в каталогах, що відповідають `WORKSPACE_GLOB_IGNORE`.
25
+ - Повертає `false` якщо не вдалося прочитати `package.json` у будь-якому з каталогів.
26
+ - Не включає в список каталог `node_modules`.
27
+ - Не включає в список каталог `.git`.
28
+ - Повертає лише кореневі каталоги пакетів монорепо, визначені в `package.json` файлах.
29
+ - Повертає відносну шляху до кореневого каталогу пакету.
30
+ - Не використовує кешування.
@@ -0,0 +1,27 @@
1
+ # worktree-notice.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл вбудовує інструкції щодо використання git-worktree, коли `meta.json.worktree` встановлено в `true`. Він забезпечує паралельне виконання скілу лише в окремому git-worktree, запобігаючи потенційним проблемам з паралелізмом. Цей механізм дозволяє уникнути гонки з CDN та забезпечує надійний запуск скілу з локальною копією CLI.
6
+
7
+ ## Поведінка
8
+
9
+ WORKTREE_START: вставляє маркер початку worktree-блоку.
10
+ WORKTREE_END: вставляє маркер кінця worktree-блоку.
11
+ injectWorktreeNotice: вставляє або видаляє worktree-блок у `SKILL.md` на основі значення `meta.json.worktree`. Якщо `meta.json.worktree` `true`, вставляє блок; інакше видаляє. Якщо блок вже існує, замінює його; якщо ні — додає. Враховує наявність YAML-frontmatter та вставляє блок після нього. Використовує транслітерацію для створення суфікса гілки. Реалізує retry-обгортку для `npx` з обмеженням часу та інтервалом для перевірки.
12
+
13
+ ## Публічний API
14
+
15
+ WORKTREE_START — Початок блоку worktree.
16
+ WORKTREE_END — Кінець блоку worktree.
17
+ injectWorktreeNotice — Змінює вміст SKILL.md, додаючи, оновлюючи або видаляючи worktree-блок.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ Якщо `meta.json.worktree === true`, то скіл виконується в окремому git-worktree.
22
+ Скіл не паралелізується.
23
+ Після створення worktree виконується `bun install` у цьому worktree.
24
+ Виконується shell-обгортка `n_cursor_npx` навколо `npx` для bootstrap-виклику.
25
+ Обгортка `n_cursor_npx` виконує retry на транзитні помилки реєстру/мережі (інтервал 30с, дефолт 5 хв, `N_CURSOR_NPX_RETRY_MAX_MIN`, ceiling 10 хв).
26
+ При виникненні nonzero CLI повертається одразу.
27
+ Команди, що вимагають command substitution, виконуються після створення worktree.
@@ -0,0 +1,38 @@
1
+ # worktree.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл містить детерміновану логіку для обробки гілок у `worktree-tool`, забезпечуючи безпечне перетворення імен гілок та створення описових файлів для `worktree`. Він використовується для генерації структури `.worktrees/` та ідентифікації неактивних описових файлів, що необхідно для операцій з видаленням. Це ключовий компонент для забезпечення консистентності та зручності роботи з `worktree-tool` безпосередньо з файловою системою.
6
+
7
+ ## Поведінка
8
+
9
+ sanitizeBranch: Перетворює ім’я git-гілки на безпечне ім’я каталогу/файла для `.worktrees/`, замінюючи небезпечні символи на дефіс.
10
+ firstFreeBranch: Знаходить першу вільну назву гілки, починаючи з заданої, і повертає її.
11
+ worktreePaths: Створює абсолютні шляхи до checkout і файла-опису для заданої гілки.
12
+ buildDescription: Генерує markdown-вміст файла-опису `.worktrees/<name>.md` на основі наданих параметрів.
13
+ buildDirtyNotice: Створює повідомлення про незакомічені зміни основного дерева, якщо їх є, обмежуючи кількість відображених файлів.
14
+ findOrphanDescFiles: Знаходить `.md`-описи, які не мають відповідного зареєстрованого worktree-checkout.
15
+
16
+ ## Публічний API
17
+
18
+ - sanitizeBranch — Перетворює ім'я гілки на безпечне ім'я для каталогу/файлу.
19
+ - firstFreeBranch — Знаходить першу вільну назву гілки, використовуючи суфікси `base`, `base2`, `base3` тощо.
20
+ - worktreePaths — Визначає шляхи для checkout гілки та файлу опису.
21
+ - buildDescription — Генерує текст опису для файлу опису worktree.
22
+ - buildDirtyNotice — Виводить повідомлення про незакомічені зміни, які не включені у worktree.
23
+ - findOrphanDescFiles — Знаходить `.md`-описи, що не мають відповідного worktree-checkout.
24
+
25
+ ## Гарантії поведінки
26
+
27
+ - `sanitizeBranch` повертає строку, безпечну для використання в шляхах файлової системи.
28
+ - `sanitizeBranch` не змінює вхідну строку.
29
+ - `worktreePaths` повертає масив з двох строк, що представляють шлях до checkout та файлу опису.
30
+ - `worktreePaths` гарантує, що обидва шляхи є дійсними.
31
+ - `buildDescription` повертає строку, що відповідає конвенції `worktree.mdc`.
32
+ - `buildDescription` не змінює вхідну строку.
33
+ - `findOrphanDescFiles` повертає масив з рядків, що представляють шляхи до файлів опису.
34
+ - `findOrphanDescFiles` гарантує, що всі рядки в масиві є дійсними шляхами файлів.
35
+ - Функції не викликають жодних побічних ефектів, що впливають на стан файлової системи.
36
+ - Функції не взаємодіють з Git або будь-якими іншими системами контролю версій.
37
+ - Результат роботи функцій не залежить від будь-яких зовнішніх факторів.
38
+ - Функції не використовують жодного кешу.
@@ -0,0 +1,50 @@
1
+ # ast-scan-utils.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл містить утиліти для AST-сканерів JavaScript та TypeScript, що використовуються для аналізу коду та виявлення потенційних проблем. Він надає інструменти для обробки AST, перетворення даних та взаємодії з різними типами вузлів, забезпечуючи основу для створення правил безпеки та аналізу коду. Ці утиліти спрощують розробку сканерів, усуваючи необхідність повторного написання boilerplate-коду.
6
+
7
+ ## Поведінка
8
+
9
+ langFromPath: Визначає мову (js, jsx, ts, tsx) на основі розширення файлу.
10
+ offsetToLine: Перетворює байтове зміщення в номер рядка для текстового файлу.
11
+ normalizeSnippet: Стискає текстовий фрагмент до 180 символів, видаляючи пробіли.
12
+ isFunctionNode: Визначає, чи є вузол AST функцією (FunctionDeclaration, FunctionExpression, ArrowFunctionExpression).
13
+ walkAstWithAncestors: Рекурсивно обходить AST, збираючи предки вузла.
14
+ parseProgramOrNull: Парсує файл JS/TS та повертає програму або null, якщо є помилки.
15
+ parseProgramAndCommentsOrNull: Парсує файл JS/TS та повертає програму та список коментарів, або null, якщо є помилки.
16
+ isJoinCall: Визначає, чи є виклик `join` у TemplateLiteral.
17
+ templateQuasisText: Збирає текст quasis з TemplateLiteral.
18
+ isSqlListContextTemplate: Визначає, чи є TemplateLiteral контекстом SQL-списку (IN/VALUES).
19
+ requireCallModule: Витягує ім'я модуля з аргументу виклику `require`.
20
+ dynamicImportModule: Витягує ім'я модуля з аргументу виклику `import`.
21
+
22
+ ## Публічний API
23
+
24
+ - langFromPath — Визначає мову Oxc на основі розширення файлу.
25
+ - offsetToLine — Перетворює зміщення в буфер на номер рядка.
26
+ - normalizeSnippet — Форматує текст повідомлення про порушення, видаляючи зайві пробіли.
27
+ - isFunctionNode — Визначає, чи є вузол у абстрактному синтаксичному дереві (AST) функцією.
28
+ - walkAstWithAncestors — Рекурсивно обходить AST, враховуючи контекст (чи знаходиться вузол всередині функції).
29
+ - parseProgramOrNull — Парсить файл та повертає AST, якщо успішно, або `null` у разі помилки.
30
+ - parseProgramAndCommentsOrNull — Парсить файл та повертає об'єкт з AST та коментарями, або `null` у разі помилки.
31
+ - isJoinCall — Визначає, чи є виклик `.join` (для динамічних списків SQL).
32
+ - templateQuasisText — Витягує текст з `quasis` у `TemplateLiteral`, ігноруючи вирази.
33
+ - isSqlListContextTemplate — Визначає, чи є `TemplateLiteral` контекстом SQL-списку (наприклад, `IN` або `VALUES`).
34
+ - requireCallModule — Перевіряє, чи є виклик `require` з рядковим ім'ям.
35
+
36
+ ## Гарантії поведінки
37
+
38
+ - `langFromPath` повертає назву мови JavaScript або TypeScript на основі розширення файлу.
39
+ - `langFromPath` повертає `null`, якщо розширення файлу не підтримується.
40
+ - `offsetToLine` перетворює зміщення в коді на номер рядка.
41
+ - `offsetToLine` повертає `null`, якщо зміщення недійсне.
42
+ - `normalizeSnippet` стискає текст сніпета.
43
+ - `normalizeSnippet` повертає `null`, якщо не вдалося стиснути сніпет.
44
+ - `isFunctionNode` визначає, чи є вузол AST функцією.
45
+ - `isFunctionNode` повертає `true` якщо вузол є функцією, інакше `false`.
46
+ - `walkAstWithAncestors` обходить AST, враховуючи предки вузлів.
47
+ - `walkAstWithAncestors` не повертає значень.
48
+ - `parseProgramOrNull` парсує програму та повертає її як AST або `null`, якщо парсинг не вдається.
49
+ - `parseProgramOrNull` повертає `null`, якщо програма не може бути успішно розпарсена.
50
+ - `parseProgramAndCommentsOrNull` парсує програму
@@ -0,0 +1,28 @@
1
+ # ensure-gitignore-entries.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей модуль відповідає за оновлення файлу `.gitignore` у корені проєкту. Він забезпечує idempotent додавання нових правил ігнорування, перевіряючи їхню наявність перед доповненням. Це необхідно для підтримки консистентності правил ігнорування в проєкті та інтеграції з інструментами тестування, такими як Stryker.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Отримує вхідні дані: каталог проєкту, список шаблонів для `.gitignore`, такий же заголовок для коментаря.
10
+ 2. Перевіряє наявність `.gitignore` у вказаному каталозі.
11
+ 3. Якщо `.gitignore` відсутній, створює новий файл з порожнім вмістом.
12
+ 4. Зчитує вміст `.gitignore` (якщо він існує).
13
+ 5. Розбиває вміст `.gitignore` на окремі рядки, видаляє пробіли на початку та в кінці кожного рядка.
14
+ 6. Перетворює отримані рядки у набір (Set) для швидкої перевірки на наявність.
15
+ 7. Визначає список шаблонів, яких немає у `.gitignore`.
16
+ 8. Якщо список шаблонів, яких немає, порожній, повертає порожній масив доданих шаблонів.
17
+ 9. Формує новий рядок для додавання у `.gitignore`. Рядок починається з заголовка, потім додає шаблони з порожнього списку, і завершується символом нового рядка.
18
+ 10. Додає сформований рядок до вмісту `.gitignore`.
19
+ 11. Записує змінений вміст `.gitignore` назад у файл.
20
+ 12. Повертає список шаблонів, які були додані до `.gitignore`.
21
+
22
+ ## Гарантії поведінки
23
+
24
+ - Якщо файл `.gitignore` існує, то записи додаються лише якщо вони відсутні.
25
+ - Якщо файл `.gitignore` не існує, то створюється новий файл `.gitignore` з доданими записами та header-коментарем.
26
+ - Записи додаються лише після видалення будь-яких пробілів з початку та кінця кожного запису.
27
+ - Якщо запис вже присутній у файлі `.gitignore`, то він не буде доданий повторно.
28
+ - Кеш не використовується.
@@ -0,0 +1,26 @@
1
+ # find-package-json-paths.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл забезпечує спільну утиліту для збору всіх файлів `package.json` у дереві проєкту, ігноруючи вказані каталоги. Він сортує знайдені шляхи пакетів за відносним розташуванням, що полегшує їх подальше використання в скриптах перевірки. Це дозволяє уникнути дублювання коду з інших інструментів перевірки та спрощує процес збору інформації про залежності.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Отримує абсолютний шлях до кореня репозиторію та список абсолютних шляхів каталогів, які потрібно ігнорувати.
10
+ 2. Ініціалізує порожній масив для зберігання шляхів до файлів `package.json`.
11
+ 3. Використовує обхід каталогу, починаючи з кореня репозиторію, для пошуку файлів `package.json`.
12
+ 4. Для кожного файлу `package.json` у каталозі, перевіряє, чи він відповідає критеріям включення (не знаходиться в ігнорованих каталогах).
13
+ 5. Якщо файл відповідає критеріям, додає його абсолютний шлях до масиву шляхів.
14
+ 6. Після завершення обходу каталогу, сортує масив шляхів до файлів `package.json` за відносним шляхом відносно кореня репозиторію.
15
+ 7. Повертає відсортований масив абсолютних шляхів до файлів `package.json`.
16
+
17
+ ## Публічний API
18
+
19
+ - findAllPackageJsonPaths — Знаходить всі файли `package.json` в каталозі та підкаталогах.
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - Функція повертає масив рядків, що представляють відносні шляхи до всіх `package.json` файлів, знайдених у дереві.
24
+ - Функція ігнорує каталоги, перелічені в аргументі `walkDir`.
25
+ - Функція не гарантує, що `package.json` файли будуть доступні.
26
+ - Функція не використовує кешування.
@@ -0,0 +1,25 @@
1
+ # lock-cache-dir.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл визначає структуру каталогу кешування блоків для git-worktree, забезпечуючи унікальний стан локу для кожного головного checkout та пов'язаних worktree. Він використовується для серіалізації запуску інструментів аналізу коду в різних worktree, запобігаючи конфліктам та забезпечуючи ефективну роботу. Створена структура кешування гарантує, що всі worktree мають доступ до одного і того ж стану локу, що необхідно для коректної серіалізації процесів аналізу.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Визначається ключ локу, що представляє конкретну задачу або конфігурацію.
10
+ 2. Визначається робоча директорія, яка використовується для виконання операцій.
11
+ 3. Використовується команда `git rev-parse --git-common-dir` для визначення спільного каталогу `.git`. Якщо команда успішна, отримується абсолютний шлях до каталогу `.git`. Якщо команда не вдалася, то цей шлях не визначено.
12
+ 4. Якщо спільний каталог `.git` визначено, то обчислюється шлях до директорії стану локу, використовуючи спільний каталог, назву ключа та префікс `n-cursor`.
13
+ 5. Якщо спільний каталог `.git` не визначено, то обчислюється шлях до директорії стану локу, використовуючи робочу директорію та префікс `node_modules/.cache/n-cursor`.
14
+ 6. Повертається обчислений абсолютний шлях до директорії стану локу.
15
+
16
+ ## Гарантії поведінки
17
+
18
+ - Спільний лок-стан для всіх git-worktree визначається шляхом `<git-common-dir>/n-cursor/<key>`.
19
+ - Якщо git недоступний, використовується кеш `node_modules/.cache/n-cursor/<key>`.
20
+ - Кеш використовується для збереження стану протягом одного прогону.
21
+ - Стан локу (`lock/owner.json`, `result.json`) є унікальним для кожного головного checkout та всіх linked-worktree.
22
+ - Унікальний стан локу запобігає паралельній роботі інструментів серіалізації.
23
+ - Унікальний стан локу гарантує, що кожен worktree має власний `node_modules/.cache/`.
24
+ - Кеш не відстежується git.
25
+ - Кеш не впливає на стан локу.
@@ -0,0 +1,25 @@
1
+ # pass.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл містить функцію для виведення повідомлень про успіх у консоль. Функція використовується в скриптах перевірки для інформування користувача про успішне завершення операцій. Вона забезпечує чіткий візуальний сигнал про успіх, що полегшує інтерпретацію результатів перевірки.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Викликається функція `pass`.
10
+ 2. Функція `pass` друкує рядок у консоль.
11
+ 3. Рядок починається з символу галочки (✅).
12
+ 4. Після символу галочки друкується переданий текст повідомлення.
13
+ 5. Функція не має жодного впливу на стан системи.
14
+ 6. Функція не взаємодіє з будь-якими зовнішніми ресурсами.
15
+
16
+ ## Публічний API
17
+
18
+ - pass: Допоміжна функція для скриптів перевірки.
19
+ Друкує в консоль рядок успіху з галочкою (✅).
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - Виводить у консоль рядок із символом ✅.
24
+ - Не виконує жодних операцій.
25
+ - Не використовує жодного кешу.
@@ -0,0 +1,23 @@
1
+ # resolve-cargo-manifest.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл визначає шлях до файлу Cargo.toml проєкту, незалежно від того, чи це кореневий Cargo.toml або один з підкаталогів workspace-у, особливо з урахуванням Tauri-патерну. Він служить утилітою для coverage-провайдера та test-концерну cargo_mutants_config, повертаючи `null` у разі невдачі для обробки ситуації без виключень. Це забезпечує гнучкий спосіб доступу до конфігурації проєкту Cargo.
6
+
7
+ ## Поведінка
8
+
9
+ resolveCargoManifest: Повертає абсолютний шлях до Cargo.toml у проєкті, починаючи з кореня, або в підкаталозі `src-tauri` якщо він існує. Повертає `null`, якщо Cargo.toml не знайдено.
10
+ resolveAllCargoManifests: Повертає масив абсолютних шляхів до всіх знайдених Cargo.toml у проєкті, пріоритет надається `src-tauri` підкаталогам, а потім загальним Cargo.toml. Повертає порожній масив, якщо жодного Cargo.toml не знайдено.
11
+
12
+ ## Публічний API
13
+
14
+ - resolveCargoManifest: Отримує інформацію про маніфест Cargo.toml з конкретного каталогу.
15
+ - resolveAllCargoManifests: Знаходить всі файли Cargo.toml в проєкті, починаючи з кореневого каталогу та підкаталогів workspace, повертаючи їх вміст.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - Функція повертає `null` у разі невдачі.
20
+ - Функція не викидає винятки.
21
+ - Функція не використовує кешування.
22
+ - Функція обробляє шляхи до `Cargo.toml` у каталогах `cwd/Cargo.toml` та підкаталогах workspace (`<workspace>/src-tauri/`).
23
+ - Функція не повертає жодного значення, якщо всі шляхи до `Cargo.toml` успішно оброблені.
@@ -0,0 +1,29 @@
1
+ # resolve-cmd.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл надає функцію `resolveCmd` для отримання абсолютного шляху до виконуваного файлу, який відповідає заданій команді. Це дозволяє викликати зовнішні інструменти, використовуючи повний шлях до файлу, а не команду з змінної PATH. Це корисно для забезпечення чіткої та однозначної ідентифікації виконуваного файлу.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Перевіряє, чи існує команда в змінній PATH системи.
10
+ 2. Визначає інструмент для пошуку команди: `where` на Windows та `which` на інших платформах.
11
+ 3. Запускає визначений інструмент з командою для пошуку.
12
+ 4. Перевіряє код повернення інструменту. Якщо код не 0 або є помилка, команда не знайдена, повертає `null`.
13
+ 5. Якщо команда знайдена, витягує перший рядок результату.
14
+ 6. Видаляє пробіли з рядка.
15
+ 7. Повертає витягнутий рядок як абсолютний шлях до команди. Якщо рядок порожній, повертає `null`.
16
+
17
+ ## Публічний API
18
+
19
+ resolveCmd — Знаходить шлях до виконуваного файлу команди в системному PATH та повертає його. Якщо команда не знайдена, повертає null.
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - Функція повертає абсолютний шлях до команди, якщо вона знайдена в змінних середовища PATH.
24
+ - Якщо команда не знайдена в PATH, функція повертає `null`.
25
+ - Функція не викидає винятки у разі невдачі.
26
+ - Функція не використовує жодного кешу.
27
+ - Функція не гарантує, що команда доступна.
28
+ - Функція не гарантує, що команда працює.
29
+ - Функція не гарантує, що команда безпечна для використання.
@@ -0,0 +1,25 @@
1
+ # resolve-js-root.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл визначає кореневий JavaScript-файл проєкту, необхідний для запуску інструментів аналізу коду. Він використовується як у великих проєктах з декількома workspace-ами, так і в окремих пакетах, забезпечуючи єдине місце для визначення кореневого розташування. Це спрощує інтеграцію з інструментами coverage та тестування.
6
+
7
+ ## Поведінка
8
+
9
+ resolveJsRoot: повертає абсолютний шлях до першого JS-кореня проєкту.
10
+ resolveAllJsRoots: повертає масив абсолютних шляхів до всіх JS-коренів проєкту, враховуючи glob-патерни з `workspaces` у кореневому `package.json`. Якщо JS-коренів немає, повертає абсолютний шлях до кореневого каталогу.
11
+
12
+ ## Публічний API
13
+
14
+ - resolveJsRoot — Знаходить кореневий JS-файл проєкту.
15
+ - resolveAllJsRoots — Знаходить всі кореневі JS-файли проєкту. Включає всі workspace-файли та їхні `package.json`, використовуючи glob-патерни. Для single-package повертає поточну директорію.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - Повертає `true`, якщо кореневий JS-файл знайдено.
20
+ - Повертає `false`, якщо кореневий JS-файл не знайдено.
21
+ - Повертає `null`, якщо не вдалося визначити кореневий JS-файл.
22
+ - Не обробляє помилки, а повертає `false` або `null`.
23
+ - Ігнорує директорії `.git` та `node_modules`.
24
+ - Не використовує кешування.
25
+ - Не здійснює мережевих запитів.
@@ -0,0 +1,36 @@
1
+ # test-helpers.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл надає допоміжні функції для тестування скриптів пакета `@nitra/cursor`. Він забезпечує створення тимчасових каталогів та запис JSON-файлів у абсолютний шлях, гарантуючи ізольованість тестів та запобігаючи мутації глобального контексту процесу. Ці функції використовуються для створення безпечного середовища для тестування, особливо при використанні git-операцій та інших файлових операцій.
6
+
7
+ ## Поведінка
8
+
9
+ withTmpDir: Створює тимчасову директорію та виконує функцію з її абсолютним шляхом, потім видаляє директорію.
10
+ writeJson: Записує JSON-файл в абсолютний шлях, форматує його та додає символ переносу рядка.
11
+ ensureDir: Створює вкладену директорію в заданому абсолютному шляху.
12
+ withShellcheckStubInPath: Створює тимчасову директорію з підставленим `shellcheck` (якщо платформа Windows), додає її до `PATH`, виконує функцію, а потім відновлює оригінальний `PATH` та видаляє тимчасову директорію.
13
+ withBinRemovedFromPath: Видаляє заданий виконуваний файл з `PATH`, виконує функцію, а потім відновлює оригінальний `PATH` та встановлює `N_CURSOR_NO_AUTO_INSTALL=1`.
14
+
15
+ ## Публічний API
16
+
17
+ - withTmpDir — Створює тимчасову директорію та передає її шлях у `fn`, потім видаляє директорію.
18
+ - writeJson — Записує JSON-файл з форматуванням.
19
+ - ensureDir — Створює вкладені каталоги.
20
+ - withShellcheckStubInPath — Створює тимчасовий каталог із `shellcheck`, додає його на `PATH` та відновлює оригінальний `PATH`.
21
+ - withBinRemovedFromPath — Виконує `fn` з `PATH`, з якого видалено каталоги з `<bin>`.
22
+ - N_CURSOR_NO_AUTO_INSTALL — Встановлює прапорець для запобігання автоматичному встановленню інструментів.
23
+
24
+ ## Гарантії поведінки
25
+
26
+ - `withTmpDir` створює тимчасовий каталог і передає його абсолютний шлях у функцію `fn`.
27
+ - `writeJson` записує об'єкт `data` у файл JSON в абсолютний шлях каталогу `dir`.
28
+ - `ensureDir` створює каталог `dir`, якщо він не існує.
29
+ - `withShellcheckStubInPath` встановлює stub Shellcheck у каталозі `dir`.
30
+ - `withBinRemovedFromPath` видаляє біни з шляху `dir`.
31
+ - Абсолютний шлях каталогу тимчасового каталогу, створеного `withTmpDir`, завжди доступний для використання.
32
+ - Функції не кидають винятків. У разі помилки, функція завершується з помилкою.
33
+ - Немає кешування.
34
+ - Не використовується `process.chdir`.
35
+ - `process.cwd` встановлюється на абсолютний шлях тимчасового каталогу.
36
+ - Всі child-процеси отримують абсолютний шлях тимчасового каталогу через `cwd`.
@@ -0,0 +1,27 @@
1
+ # walk-cache.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл забезпечує спільний кеш результатів обходу файлової системи для всіх операцій перевірки. Він зберігає список файлів, що відповідають заданим шаблонам, щоб уникнути повторних обходів. Це підвищує ефективність процесу перевірки, особливо при великій кількості файлів та шаблонів.
6
+
7
+ ## Поведінка
8
+
9
+ getOrCreateWalkCache: Створює або повертає кеш.
10
+ resetWalkCache: Скидає кеш.
11
+
12
+ ## Публічний API
13
+
14
+ - getOrCreateWalkCache — Створює або повертає cache, ініціалізує його при першому використанні.
15
+ - resetWalkCache — Очищає cache.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - Кеш існує лише в межах одного процесу.
20
+ - Кеш скидається при виклику `resetWalkCache`.
21
+ - Кеш зберігає список файлів, отриманий в результаті прогону.
22
+ - Значення кешу – `Promise<string[]>`.
23
+ - Кеш використовується для обробки glob/regex дескрипторів.
24
+ - Кеш не використовується для взаємодії з мережею.
25
+ - Кеш зберігає дані лише протягом одного прогону.
26
+ - Кеш не гарантує наявності файлів, що відповідають дескрипторам.
27
+ - Кеш не гарантує порядку файлів у списку.
@@ -0,0 +1,32 @@
1
+ # walkDir.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл `n-cursor.js` забезпечує рекурсивний обхід каталогів для скриптів перевірки, дозволяючи виконувати callback-функцію для кожного звичайного файлу. Він обходить дерево каталогів від заданого кореня, ігноруючи певні директорії (наприклад, `.git`, `node_modules`) та шляхи, вказані в `ignorePaths`. Це дозволяє автоматизувати процес аналізу конфігураційних файлів та інших ресурсів у проєкті.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Починається з заданого кореневого каталогу.
10
+ 2. Для кожного підкаталогу в кореневому каталозі:
11
+ 2.1. Перевіряє, чи є підкаталог у списку `ignorePaths`. Якщо так, пропускає обхід цього підкаталогу та його вмісту.
12
+ 2.2. Якщо підкаталог не в списку `ignorePaths`, обробляє вміст підкаталогу:
13
+ 2.2.1. Для кожного файлу в підкаталозі, викликає функцію `onFile` з шляхом до файлу.
14
+ 2.2.2. Для кожного підкаталогу в підкаталозі, рекурсивно викликає функцію `walkDir` для обходу цього підкаталогу. Під час рекурсивного виклику, також перевіряє, чи є підкаталог у списку `ignorePaths`.
15
+ 3. Не обробляє каталоги `node_modules`, `.git`, `dist`, `coverage`, `.turbo` та `.next`.
16
+ 4. Якщо при спробі `readdir` для каталогу виникає помилка, обхід цього каталогу припиняється.
17
+ 5. Обхід завершується, коли всі підкаталоги та файли в заданому дереві були оброблені.
18
+
19
+ ## Публічний API
20
+
21
+ - walkDir — Обходить каталог рекурсивно, ігноруючи вказані шляхи.
22
+
23
+ ## Гарантії поведінки
24
+
25
+ - Функція рекурсивно обходить дерево каталогів, починаючи з заданого кореня.
26
+ - Для кожного звичайного файлу викликається переданий callback.
27
+ - Не обходить каталоги `node_modules`, `.git`, `dist`, `coverage`, `.turbo`, `.next`.
28
+ - Може пропустити каталоги, вказані в `ignorePaths`.
29
+ - У разі невдачі `readdir` для каталогу, функція тихо виходить без викидання помилок.
30
+ - Функція не викидає винятки назовні.
31
+ - У разі невдачі повертає `false` або `null`.
32
+ - Не використовує кешування.
@@ -0,0 +1,25 @@
1
+ # with-lock.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл реалізує механізм захисту від одночасного виконання критичних операцій, забезпечуючи атомарний lock та дедуплікацію даних для інтенсивних команд. Він використовується для запобігання конфліктів при одночасному виконанні операцій, які можуть призвести до пошкодження даних або непередбачуваних результатів. Механізм гарантує, що кожен прогін операцій виконується без повторень та з атомарним lock.
6
+
7
+ ## Поведінка
8
+
9
+ - `shouldDedup`: Перевіряє, чи можна повторно використати кешований результат, враховуючи код виходу, відбитковий дерева та час завершення.
10
+ - `withLock`: Встановлює lock-директорію, запускає вказану функцію, кешує результат та повторно використовує його, якщо можливо, з використанням дедуплікації за відбитком.
11
+
12
+ ## Публічний API
13
+
14
+ - shouldDedup — Перевіряє, чи можна використовувати попередньо обчислену відповідь для уникнення повторних обчислень.
15
+ - withLock — Забезпечує унікальність виконання важкої операції за допомогою блокування та перевірки на основі відбитків.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - **Атомарність:** Операції lock та dedup виконуються як атомарні дії.
20
+ - **Захист від помилок:** У разі виникнення помилки, функція повертає `false` та `null`.
21
+ - **Детектування неактивного PID:** Перевіряється, чи процес, що утримує lock, все ще активний.
22
+ - **Дедуплікація з обмеженням часу:** Проводиться дедуплікація за допомогою SHA256 з обмеженням часу (TTL).
23
+ - **Кешування:** Результати прогону кешуються для прискорення наступних проходів.
24
+ - **Відсутність винятків:** Функції не викликають винятків.
25
+ - **Створення директорій:** Використовується `mkdirSync` для створення директорій.
@@ -0,0 +1,27 @@
1
+ # worktree-fingerprint.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл надає унікальний відбиток робочої директорії. Цей відбиток використовується для ідентифікації та порівняння робочих директорій, забезпечуючи їх унікальність у системі. Він слугує базовим інструментом для відстеження та управління версіями.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Отримує поточний SHA256 хеш коміту, який знаходиться в гілці HEAD.
10
+ 2. Отримує текст зміни між комітом HEAD та робочим каталогом.
11
+ 3. Отримує список не відстежених файлів у робочому каталозі, не включаючи стандартні файли, що ігноруються.
12
+ 4. Для кожного не відстеженого файлу отримує його SHA256 хеш.
13
+ 5. Об'єднує SHA256 хеш коміту, текст зміни та пари "файл:хеш" не відстежених файлів, розділяючи їх новими рядками.
14
+ 6. Обчислює SHA256 хеш отриманого текстового рядка.
15
+ 7. Повертає отриманий SHA256 хеш у форматі 64-значної шестнадцяткової строки.
16
+ 8. Якщо виникає помилка під час виконання будь-якої з операцій, повертає `null`.
17
+
18
+ ## Публічний API
19
+
20
+ worktreeFingerprint — генерує унікальний відбиток поточного стану репозиторію Git.
21
+
22
+ ## Гарантії поведінки
23
+
24
+ - Функція повертає `true`, якщо відбиток дерева робіт успішно обчислено.
25
+ - Функція повертає `null`, якщо обчислення відбитка дерева робіт не вдалося.
26
+ - Функція не викликає винятків.
27
+ - Функція не використовує кеш.