@nitra/cursor 3.27.0 → 3.29.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 (128) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/package.json +1 -3
  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/coverage-classify/index.mjs +60 -72
  63. package/scripts/coverage-fix.mjs +26 -23
  64. package/scripts/dispatcher/lib/subagent-runner.mjs +33 -102
  65. package/scripts/docs/coverage-fix-extract.md +32 -0
  66. package/scripts/docs/lint-cli.md +25 -0
  67. package/scripts/docs/post-tool-use-fix.md +27 -0
  68. package/scripts/docs/rename-yaml-extensions.md +36 -0
  69. package/scripts/docs/skills-cli.md +35 -0
  70. package/scripts/docs/sync-claude-config.md +52 -0
  71. package/scripts/docs/sync-setup-bun-deps-action.md +26 -0
  72. package/scripts/docs/upgrade-nitra-cursor-and-install.md +29 -0
  73. package/scripts/docs/worktree-cli.md +46 -0
  74. package/scripts/lib/docs/assert-project-root.md +28 -0
  75. package/scripts/lib/docs/diff-added-lines.md +34 -0
  76. package/scripts/lib/docs/read-n-cursor-config-lite.md +28 -0
  77. package/scripts/lib/docs/resolve-target-files.md +34 -0
  78. package/scripts/lib/docs/root-notice.md +28 -0
  79. package/scripts/lib/docs/rule-meta-helpers.md +34 -0
  80. package/scripts/lib/docs/rule-meta.md +34 -0
  81. package/scripts/lib/docs/rule-predicates.md +30 -0
  82. package/scripts/lib/docs/run-conftest-batch.md +26 -0
  83. package/scripts/lib/docs/run-lint-step.md +25 -0
  84. package/scripts/lib/docs/run-rule-cli.md +27 -0
  85. package/scripts/lib/docs/run-rule.md +32 -0
  86. package/scripts/lib/docs/run-standard-lint.md +22 -0
  87. package/scripts/lib/docs/run-standard-rule.md +24 -0
  88. package/scripts/lib/docs/skill-meta.md +31 -0
  89. package/scripts/lib/docs/sync-gitignore-worktree.md +31 -0
  90. package/scripts/lib/docs/template.md +40 -0
  91. package/scripts/lib/docs/timing-summary.md +24 -0
  92. package/scripts/lib/docs/workspaces.md +30 -0
  93. package/scripts/lib/docs/worktree-notice.md +27 -0
  94. package/scripts/lib/docs/worktree.md +38 -0
  95. package/scripts/utils/docs/ast-scan-utils.md +50 -0
  96. package/scripts/utils/docs/ensure-gitignore-entries.md +28 -0
  97. package/scripts/utils/docs/find-package-json-paths.md +26 -0
  98. package/scripts/utils/docs/lock-cache-dir.md +25 -0
  99. package/scripts/utils/docs/pass.md +25 -0
  100. package/scripts/utils/docs/resolve-cargo-manifest.md +23 -0
  101. package/scripts/utils/docs/resolve-cmd.md +29 -0
  102. package/scripts/utils/docs/resolve-js-root.md +25 -0
  103. package/scripts/utils/docs/test-helpers.md +36 -0
  104. package/scripts/utils/docs/walk-cache.md +27 -0
  105. package/scripts/utils/docs/walkDir.md +32 -0
  106. package/scripts/utils/docs/with-lock.md +25 -0
  107. package/scripts/utils/docs/worktree-fingerprint.md +27 -0
  108. package/skills/docgen/js/docgen-batch.mjs +95 -0
  109. package/skills/docgen/js/docgen-extract.mjs +33 -18
  110. package/skills/docgen/js/docgen-gen.mjs +140 -154
  111. package/skills/docgen/js/docgen-ignore.mjs +1 -6
  112. package/skills/docgen/js/docgen-prompts.mjs +33 -22
  113. package/skills/docgen/js/docgen-scan.mjs +1 -8
  114. package/skills/docgen/js/docs/docgen-extract.md +28 -0
  115. package/skills/docgen/js/docs/docgen-gen.md +41 -0
  116. package/skills/docgen/js/docs/docgen-ignore.md +24 -0
  117. package/skills/docgen/js/docs/docgen-prompts.md +24 -0
  118. package/skills/docgen/js/docs/docgen-scan.md +48 -0
  119. package/skills/fix/js/docs/llm-worker.md +27 -0
  120. package/skills/fix/js/docs/orchestrator.md +32 -0
  121. package/skills/fix/js/docs/t0.md +29 -0
  122. package/skills/fix/js/llm-worker.mjs +64 -29
  123. package/skills/fix/js/orchestrator.mjs +45 -54
  124. package/skills/fix/js/t0.mjs +16 -32
  125. package/skills/start-check/js/check.mjs +1 -16
  126. package/skills/start-check/js/docs/check.md +34 -0
  127. package/skills/taze/js/diff.mjs +1 -15
  128. package/skills/taze/js/docs/diff.md +33 -0
@@ -0,0 +1,34 @@
1
+ # resolve-target-files.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл відповідає за перевірку наявності файлів, що відповідають певним правилам, вказаним у файлах `policy/<name>/target.json`. Він створює список файлів для подальшого використання, використовуючи або конкретні відносні шляхи, або обхід каталогу з використанням шаблонів та ігнорування файлів. Це забезпечує узгодженість та контроль над файлами, які потрібно обробити, відповідно до заданих політик.
6
+
7
+ ## Поведінка
8
+
9
+ 1. **Ініціалізація:** Отримує специфікацію файлів з `target.json`, включаючи `single` або `walkGlob`.
10
+ 2. **Обробка `single`:** Якщо `files.single` є рядком, перевіряє, чи шлях є відносним та не містить сегменту `..`. Якщо шлях безпечний, перевіряє наявності файлу за шляхом та повертає масив з абсолютним шляхом, якщо файл існує, або порожній масив, якщо ні.
11
+ 3. **Обробка `walkGlob`:** Якщо `files.walkGlob` є не визначеним, або є масивом рядків, виконує обхід дерева файлів від заданого кореня.
12
+ 4. **Завантаження ігнорування:** Завантажує список абсолютних шляхів, які слід ігнорувати, з конфігурації `.n-cursor.json:ignore`.
13
+ 5. **Кешування обходу:** Використовує кеш обходу дерева (Map) для запобігання повторному обходу одного й того ж набору ігнорування. Якщо обхід вже виконано для заданого набору ігнорування, повертає результат з кешу.
14
+ 6. **Обхід дерева:** Якщо обхід не кешований або кеш порожній, виконує обхід дерева файлів від заданого кореня, використовуючи `walkDir`. Під час обходу генерує відносні шляхи файлів від кореня.
15
+ 7. **Фільтрація за масками:** Для кожного відносного шляху файлу застосовує маски `walkGlob` за допомогою `picomatch`. Фільтрує файли, які відповідають маскам, та виключає ті, що відповідають негативним маскам.
16
+ 8. **Збіг з ігноруванням:** Перевіряє, чи файл не входить до списку ігнорування.
17
+ 9. **Збіг шляху:** Перетворює відносні шляхи файлів у абсолютні шляхи, додавши корень.
18
+ 10. **Повернення результатів:** Повертає масив абсолют
19
+
20
+ ## Публічний API
21
+
22
+ resolveTargetFiles — Знаходить файли, що вказані в `target.json:files`.
23
+
24
+ ## Гарантії поведінки
25
+
26
+ - **Контракт на поліси:** Зчитуються лише файли з репозиторію.
27
+ - **`single`:** Якщо `existsSync`, повертається список файлів, що відповідають `single`. Інакше, повертається порожній список.
28
+ - **`walkGlob`:** Використовується picomatch для обробки glob-шаблонів відносно шляхів, отриманих з обходу `walkDir` від `root`.
29
+ - **Ігнорування:** Підтримується ігнорування файлів за допомогою `.n-cursor.json:ignore` та кешування шляхів ігнорування у `walkCache`.
30
+ - **Кешування:** Результати обходу кешуються для повторного використання при однаковому наборі ігнорувань.
31
+ - **Path-traversal:** При розв'язанні шляхів у формі `single` виникає помилка.
32
+ - **Відсутність результатів:** Якщо не знайдено жодного файлу, що відповідає критеріям, повертається порожній список.
33
+ - **Fail-safe:** Якщо `required` встановлено на `true`, і не знайдено жодного файлу, що відповідає критеріям, виникає помилка.
34
+ -
@@ -0,0 +1,28 @@
1
+ # root-notice.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл вставляє root-guard preflight для скілів, які змінюють проєкт у поточному каталозі. Він забезпечує, що скіл виконується in-place, без ізоляції worktree, і використовується для випадків, коли не потрібна ізоляція worktree. Це гарантує коректне виконання скілу від імені проєкту.
6
+
7
+ ## Поведінка
8
+
9
+ ROOT_START: вставляє маркер початку root-блоку.
10
+ ROOT_END: вставляє маркер кінця root-блоку.
11
+ injectRootNotice: вставляє, оновлює або видаляє root-guard блок у вмісті `SKILL.md` на основі параметра `enabled`.
12
+
13
+ ## Публічний API
14
+
15
+ - ROOT_START — Позначає початок блоку root.
16
+ - ROOT_END — Позначає кінець блоку root.
17
+ - injectRootNotice — Змінює вміст `SKILL.md` щодо root-guard блоку.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - Якщо `requireRoot: true` у `meta.json`, то поточний робочий каталог є коренем проєкту.
22
+ - Якщо `requireRoot: false`, то блок не вставляється.
23
+ - Вставка відбувається лише між маркерами.
24
+ - Вставка ре-синк ідемпотентно: наявний блок замінюється.
25
+ - `ROOT_START` викликається перед вставкою блоку.
26
+ - `ROOT_END` викликається після вставки блоку.
27
+ - `injectRootNotice` викликається під час вставки блоку.
28
+ - Немає кешування.
@@ -0,0 +1,34 @@
1
+ # rule-meta-helpers.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл містить хелпери для автоматичного виявлення та обробки правил конфігурації репозиторіїв. Він надає функції для ідентифікації ID міграцій, нормалізації списків та визначення URL репозиторіїв, а також для виявлення монорепо-пакетів. Ці функції використовуються для автоматизованої обробки конфігурації та забезпечення узгодженості в репозиторіях.
6
+
7
+ ## Поведінка
8
+
9
+ `RULE_MIGRATIONS`: містить відомості про застарілі ідентифікатори правил та їхні відповідні актуальні ідентифікатори.
10
+ `migrateRuleIds`: перетворює введений список ідентифікаторів правил на список, де застарілі ідентифікатори замінені на актуальні, зберігаючи порядок і усуваючи дублікати.
11
+ `detectLegacyRuleIds`: витягує з введеного списку ідентифікаторів правил ті, що потребують заміни на актуальні.
12
+ `normalizeIdList`: нормалізує введений список ідентифікаторів правил, видаляючи пробіли, перетворюючи на нижній регістр та зберігаючи порядок, усуваючи дублікати.
13
+ `getRepositoryUrl`: повертає URL репозиторію з `package.json`, якщо він є рядком або об'єктом, інакше повертає `null`.
14
+ `isMonorepoPackage`: визначає, чи оголошено `workspaces` в `package.json`, повертаючи `true` якщо так, і `false` в іншому випадку.
15
+
16
+ ## Публічний API
17
+
18
+ - RULE_MIGRATIONS — Карта, яка відображає застарілі rule-id на актуальні, для автоматичної міграції при читанні конфігурації.
19
+ - migrateRuleIds — Розгортає застарілі rule-id згідно з `RULE_MIGRATIONS`, зберігаючи порядок, дедуплікуючи та не змінюючи вхідний список.
20
+ - detectLegacyRuleIds — Повертає список застарілих rule-id, для яких є відповідність у `RULE_MIGRATIONS`, для логування міграції.
21
+ - normalizeIdList — Нормалізує список ідентифікаторів, видаляючи пробіли, перетворюючи на нижній регістр та зберігаючи порядок.
22
+ - getRepositoryUrl — Отримує URL репозиторію з `package.json`.
23
+ - isMonorepoPackage — Перевіряє, чи `package.json` містить поле `workspaces`, що вказує на монорепо.
24
+
25
+ ## Гарантії поведінки
26
+
27
+ - `RULE_MIGRATIONS` повертає `true`, якщо успішно виконано міграцію правил. Повертає `false` у разі помилки.
28
+ - `migrateRuleIds` змінює внутрішній стан, щоб відобразити успішну міграцію ідентифікаторів правил.
29
+ - `detectLegacyRuleIds` повертає список ідентифікаторів правил, які вважаються застарілими.
30
+ - `normalizeIdList` повертає нормалізований список ідентифікаторів правил.
31
+ - `getRepositoryUrl` повертає URL репозиторію, якщо він існує. Повертає `null` у разі помилки.
32
+ - `isMonorepoPackage` повертає `true`, якщо пакет є частиною монорепо. Повертає `false` у разі помилки.
33
+ - Функції не викликають винятки. У разі невдачі повертають `false` або `null`.
34
+ - Кеш не використовується.
@@ -0,0 +1,34 @@
1
+ # rule-meta.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл парсує метадані правил npm/rules/<id>/meta.json для автоматичного виявлення проблемних місць у коді. Він визначає, коли правило має бути активним, використовуючи різні специфікації, такі як завжди-ввімкнене правило, правило, яке активується після виявлення залежностей, або правило, яке активується на основі glob-шаблонів чи незводимих предикатів. Це дозволяє системі динамічно визначати та застосовувати правила, не потребуючи явного налаштування.
6
+
7
+ ## Поведінка
8
+
9
+ `RULE_ALWAYS`: визначає літерал для активації правила "завжди".
10
+ `parseRuleAutoSpec`: нормалізує значення `meta.json.auto` у дискриміновану форму.
11
+ `parseRuleLintPhase`: нормалізує значення `meta.json.lint` у фазу lint.
12
+ `readRuleMetaRaw`: читає та парсить `meta.json` одного правила, повертаючи об’єкт або `null`.
13
+
14
+ ## Публічний API
15
+
16
+ - RULE_ALWAYS — Активує правило.
17
+ - parseRuleAutoSpec — Перетворює значення `meta.json.auto` на конкретну опцію.
18
+ - parseRuleLintPhase — Перетворює значення `meta.json.lint` на фазу lint.
19
+ - readRuleMetaRaw — Зчитує та аналізує файл `meta.json` правила.
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - `RULE_ALWAYS` повертає `true` якщо правило активне.
24
+ - `parseRuleAutoSpec` повертає `true` якщо специфікація правила успішно розібрана.
25
+ - `parseRuleAutoSpec` повертає `false` якщо специфікація правила не може бути розібрана.
26
+ - `parseRuleLintPhase` повертає `true` якщо правило успішно розібрано на етапі linting.
27
+ - `parseRuleLintPhase` повертає `false` якщо правило не може бути розібрано на етапі linting.
28
+ - `readRuleMetaRaw` повертає `true` якщо метадані правила успішно прочитані.
29
+ - `readRuleMetaRaw` повертає `false` якщо метадані правила не можуть бути прочитані.
30
+ - У разі невдачі, функція повертає `false` або `null`.
31
+ - Функції не кидають винятків.
32
+ - Немає кешування.
33
+ - Немає гарантій щодо стану файлів або каталогів.
34
+ - Поля `worktree` правила не використовуються.
@@ -0,0 +1,30 @@
1
+ # rule-predicates.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл містить набір предикатів, які використовуються для автоматичного визначення правил. Ці предикати дозволяють перевіряти наявність файлів, вміст source-коду та інформацію з репозиторіїв, щоб виявляти потенційні порушення правил. Він забезпечує механізм для автоматизованого пошуку та виявлення правил на основі даних.
6
+
7
+ ## Поведінка
8
+
9
+ 1. **Ініціалізація перевірки репозиторію:** Отримує URL репозиторію з кореневого `package.json` або з `meta.json.repository`. Перевіряє, чи URL існує і чи містить він вказаний маркер.
10
+ 2. **Перевірка залежностей у дереві:** Для кожного `package.json` у дереві репозиторію, перебирає всі пакети в залежностях. Якщо пакет має вказаний маркер, повертає `true`. Ігнорує директорії `node_modules`, `.git`, `.next` та `.turbo`.
11
+ 3. **Перевірка вкладених `package.json`:** Для кореневого `package.json` перевіряє, чи є в будь-якому вкладеному `package.json` відсутній `vite` у секції `devDependencies`. Ігнорує директорії `node_modules`, `.git`, `.next` та `.turbo`.
12
+ 4. **Перевірка фактів:** Якщо надано факти, перевіряє наявність `hasGqlTaggedTemplates` та `hasHasuraConfig`. Якщо `hasGqlTaggedTemplates` має значення `true`, повертає `true`. Якщо `hasHasuraConfig` має значення `true`, повертає `true`.
13
+ 5. **Перевірка наявності `bun`:** Якщо надано факти, перевіряє наявність `hasBunSqlImport`. Якщо `hasBunSqlImport` має значення `true`, повертає `true`.
14
+ 6. **Перевірка залежностей `pg`:** Якщо надано факти, перевіряє наявність `pg`, `pg-format` або `mysql2` у залежностях. Якщо будь-яка з цих залежностей присутня, повертає `true`.
15
+ 7. **Перевірка вкладеного `package.json` без `vite`:** Отримує кореневий `package.json`. Перебирає всі вкладені `package.json` (крім кореневого). Якщо вкладений `package.json` не містить `vite` у `devDependencies`, повер
16
+
17
+ ## Публічний API
18
+
19
+ RULE_PREDICATES — Зберігає предикати та їх реалізації. Використовується для виклику через `meta.json.auto.predicate`.
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - Функція повертає результат виконання предиката.
24
+ - Результат може бути істинним або хибним.
25
+ - При виникненні помилки, результат завжди хибний.
26
+ - Не враховує наявність `.git` та `node_modules` у файловій системі.
27
+ - Не використовує кешування.
28
+ - Не генерує винятків.
29
+ - Аргументи предиката можуть бути значеннями, отриманими з файлів `meta.json`, шляхів у файловій системі або URL-адрес.
30
+ - Результат залежить від вмісту та структури зазначених джерел.
@@ -0,0 +1,26 @@
1
+ # run-conftest-batch.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл запускає `conftest test` на заданому списку файлів, виявляючи порушення правил, визначених у Rego-полісіях. Він використовується для автоматизованої перевірки конфігураційних файлів на відповідність заданим вимогам. Результати перевірки повертаються у структурованому вигляді, що дозволяє інтегрувати результати в інші процеси валідації.
6
+
7
+ ## Поведінка
8
+
9
+ buildConftestArgs: Будує аргументи командного рядка для запуску `conftest test`, враховуючи список файлів, namespace та додаткові аргументи.
10
+ runConftestBatch: Запускає `conftest test` для заданого списку файлів, повертає масив порушень у форматі JSON, якщо `conftest` успішно завершився, і кидає виняток, якщо `conftest` не знайдено або завершився з помилкою. Створює тимчасову директорію для збереження даних шаблону, якщо передано `templateData`.
11
+
12
+ ## Публічний API
13
+
14
+ - buildConftestArgs: Створює аргументи для тесту conftest. Витягнуто для зручності тестування. Зберігає поточну структуру аргументів (файли перед `-p`, `--output json` та `--no-color` для читабельного виводу) і вставляє `--data` після `--namespace`, якщо він заданий.
15
+ - runConftestBatch: Запускає `conftest test` для всіх файлів з одного процесу та повертає масив помилок. Якщо `files` порожній, повертає порожній масив. Якщо `conftest` не знайдено в системному шляху та автоматична установка не вдалася, виникає помилка.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - Запускає `conftest test` на заданому списку файлів.
20
+ - Повертає всі виявлені порушення у структурованому вигляді.
21
+ - Якщо `conftest` не встановлено, намагається автоматично встановити його.
22
+ - У разі невдачі встановлення `conftest`, завершує роботу з помилкою.
23
+ - Не кидає винятків назовні.
24
+ - Не використовує кешування.
25
+ - Не перехоплює помилки, а завершує роботу з помилкою.
26
+ - Не має взаємодії з мережею.
@@ -0,0 +1,25 @@
1
+ # run-lint-step.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл забезпечує спільний хелпер для запуску окремих кроків у ланцюжку linting, що використовується CLI-обгортками. Він імітує прямий виклик команд у shell, логуючи команди та перенаправляючи stdout/stderr на користувацькі stream-и. Це дозволяє уникнути дублювання обгорток у різних `rules/<id>/js/lint.mjs` файлах.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Записує в лог повідомлення про початок виконання кроку ланцюжка з описом команди та її аргументів.
10
+ 2. Визначає шлях до виконуваного файлу команди на основі її імені.
11
+ 3. Якщо шлях не знайдено в системному PATH, записує повідомлення про помилку та повертає код 127.
12
+ 4. Запускає визначену команду з заданими аргументами, передаючи стандартний потік введення/виведення (stdio) потокам користувача.
13
+ 5. Якщо команда завершилася з помилкою, записує повідомлення про помилку та повертає код 1.
14
+ 6. Якщо команда завершилася успішно, повертає код виходу дочірнього процесу, який дорівнює 0, якщо все добре, або 1, якщо виникла помилка.
15
+
16
+ ## Публічний API
17
+
18
+ runLintStep — запускає процес linting та перевіряє його успішність.
19
+
20
+ ## Гарантії поведінки
21
+
22
+ - Запускає один крок ланцюжка linting.
23
+ - Перенаправляє stdout та stderr на користувацькі stream-и (stdio: 'inherit').
24
+ - Не використовує кешування.
25
+ - Не має внутрішніх приватних імен.
@@ -0,0 +1,27 @@
1
+ # run-rule-cli.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл є самостійним CLI-запускомком для правила, який дозволяє запускати правила з файлів `.n-cursor.json` та виконувати їхні дії. Він забезпечує інтеграцію з інструментом `cursor`, імітуючи старий `npx @nitra/cursor fix <id>`. Файл виконує перевірку whitelist, генерує summary та повертає агрегований код виходу.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Визначає ID правила на основі шляху директорії правила.
10
+ 2. Зчитує конфігурацію з файлу `.n-cursor.json`.
11
+ 3. Перевіряє, чи правило включено в конфігурації. Якщо ні, пропускає перевірку та повертає код успіху (0).
12
+ 4. Виводить інформаційне повідомлення про початок перевірки правила.
13
+ 5. Створює або отримує кеш для обходу файлової структури.
14
+ 6. Запускає стандартний процес перевірки правила, передаючи кеш.
15
+ 7. Отримує код завершення процесу перевірки правила.
16
+ 8. Виводить підсумковий результат перевірки (успіх або невдача).
17
+ 9. Повертає код завершення процесу перевірки правила.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - Запускає правило з файлу `fix.mjs`.
22
+ - Читає файл `.n-cursor.json` для конфігурації правила.
23
+ - Перевіряє, чи правило включено в whitelist.
24
+ - Виводить підсумкову інформацію про результат виконання.
25
+ - Повертає код завершення, що відображає загальний статус виконання.
26
+ - Кешує результати для уникнення повторного виконання, поки не змінено конфігурацію або не було перезапущено.
27
+ - Не здійснює жодних мережевих запитів.
@@ -0,0 +1,32 @@
1
+ # run-rule.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл є оркестратором правил, що запускається з командного рядка. Він застосовує правила, визначаючи та виконуючи концерни, а також політичні концерни, використовуючи кешування для підвищення ефективності. Файл забезпечує централізований спосіб виконання правил та збору результатів.
6
+
7
+ ## Поведінка
8
+
9
+ - `runTemplateSubsetConcern`: Перевіряє файл-концерт за допомогою шаблону, повертаючи 0, якщо все ОК, або 1, якщо є порушення.
10
+ - `evaluateAppliesGate`: Викликає функцію `applies` з `js/applies.mjs`, якщо вона існує та повертає `true`.
11
+ - `runPolicyConcern`: Запускає policy-концерт через `runConftestBatch`, повертаючи 0, якщо все ОК, або 1, якщо є порушення.
12
+ - `runRule`: Оркеструє правила, викликаючи `evaluateAppliesGate`, JS-концерни та policy-концерни, об'єднуючи exit-коди.
13
+
14
+ ## Публічний API
15
+
16
+ - runTemplateSubsetConcern — Перевірка відповідності шаблонів: порівнює конфігурацію шаблонів з фактичним файлом, забезпечуючи дотримання правил.
17
+ - runRule — Запуск правила: виконує послідовність дій, включаючи перевірку концернів, і застосовує політику.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - `applies-гейт` викликає `applies` з `js/applies.mjs`.
22
+ - `applies` повертає `false` — виводить `✅ правило не застосовне` і завершує.
23
+ - `JS-концерни` викликають `applies` після `applies-гейт`.
24
+ - `JS-концерни` можуть викликати `check` для виведення контексту.
25
+ - `Policy-концерни` викликають `runConftestBatch`.
26
+ - `resolveTargetFiles` кешує результати `walkCache` між `JS-концернами`.
27
+ - `createCheckReporter` у `Policy-концерни` OR-ює exit-коди.
28
+ - Exit-код правила — 0 або 1.
29
+ - `runTemplateSubsetConcern` запускає підмножину шаблонів.
30
+ - `runRule` запускає правило.
31
+ - Кеш використовується для зберігання результатів `resolveTargetFiles` у межах прогону.
32
+ - Немає взаємодії з мережею.
@@ -0,0 +1,22 @@
1
+ # run-standard-lint.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл забезпечує централізовану точку запуску для підкоманд `lint-<rule>` у `@nitra/cursor`. Він серіалізує та дедублює запуски, використовуючи `withLock`, щоб гарантувати узгодженість та ефективність. Це дозволяє легко інтегрувати нові правила та обробляти крос-cutting концерни, не вносячи змін у окремі файли правил.
6
+
7
+ ## Поведінка
8
+
9
+ runLintFooCli: Запускає лінт для правила, використовуючи `runStandardLint`.
10
+ runStandardLint: Серіалізує та дедуплікує запуск лінту, використовуючи блокування. Визначає ідентифікатор правила з шляху.
11
+
12
+ ## Публічний API
13
+
14
+ - runLintFooCli — Перевіряє код на відповідність стандартам Foo CLI.
15
+ - runStandardLint — Перевіряє код на відповідність загальним стандартам кодування.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - Приймає `ruleId` з шляху файлу.
20
+ - Створює блокування з іменем `lint-<ruleId>`.
21
+ - Використовує попередньо збережені результати для уникнення повторного виконання.
22
+ - Повертає результат виконання.
@@ -0,0 +1,24 @@
1
+ # run-standard-rule.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл забезпечує публічний інтерфейс для оркестрування правил. Він обігріває виклик `discoverOneRule` до виконання правил, керуючи їхнім виконанням на основі контексту та політики. Це централізована точка інтеграції для запуску правил, забезпечуючи дедуплікацію та кешування для оптимізації продуктивності.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Отримує шлях до директорії правила.
10
+ 2. Визначає ідентифікатор правила з назви директорії.
11
+ 3. Отримує дані правила з директорії правила.
12
+ 4. Отримує або створює кеш для прогону.
13
+ 5. Запускає виконання правила, використовуючи отримані дані та кеш.
14
+ 6. Забезпечує унікальний лок для паралельного запуску правила.
15
+ 7. Повертає код успіху (0) або код помилки (1) в залежності від результатів виконання правила.
16
+
17
+ ## Гарантії поведінки
18
+
19
+ - Виконання правил інкапсулює логіку `discoverOneRule` та `runRule`.
20
+ - Виконання правил відбувається всередині блоку `withLock`.
21
+ - Виконання правил дедублюється на основі стану git-дерева.
22
+ - Різні правила можуть виконуватися паралельно.
23
+ - Кеш використовується для зберігання результатів виконання правил в межах одного прогону.
24
+ - Не допускається локальна логіка всередині правил. Розширення поведінки реалізується через опції контексту.
@@ -0,0 +1,31 @@
1
+ # skill-meta.mjs
2
+
3
+ ## Огляд
4
+
5
+ Цей файл парсить метадані скілу з файлу `meta.json` та надає інформацію про його конфігурацію. Він служить єдиним джерелом правди про скіл, замінюючи старий `auto.md`, і використовується для визначення, чи потрібно запускати скіл в окремому worktree, чи з кореня репозиторію. Це забезпечує узгодженість даних про скіли та полегшує їх використання в інших частинах системи.
6
+
7
+ ## Поведінка
8
+
9
+ SKILL_ALWAYS: визначає літерал для безумовної автоактивації.
10
+ parseSkillAutoSpec: перетворює значення `auto` з `meta.json` у об’єкт `SkillAutoSpec`.
11
+ skillRequiresRoot: визначає, чи вимагає скіл запуску з кореня репо.
12
+ readSkillMetaRaw: читає та парсить `meta.json` одного скіла, повертаючи розпарсений об’єкт або `null`.
13
+
14
+ ## Публічний API
15
+
16
+ - SKILL_ALWAYS — Активує скіл завжди.
17
+ - parseSkillAutoSpec — Перетворює специфікацію авто-скілу з JSON.
18
+ - skillRequiresRoot — Перевіряє, чи потрібен скілу доступ до кореневої директорії.
19
+ - readSkillMetaRaw — Зчитує та аналізує метадані скілу з файлу JSON.
20
+
21
+ ## Гарантії поведінки
22
+
23
+ - Повертає `false` якщо не вдається розібрати `meta.json`.
24
+ - Повертає `null` якщо не вдається визначити `auto.spec`.
25
+ - `auto.spec` завжди є масивом id правил, якщо `auto.spec` визначено.
26
+ - `worktree` має значення `true` лише для скілів, які потребують окремого git-worktree.
27
+ - `requireRoot` має значення `true` лише для скілів, які мутують в CWD без worktree-ізоляції.
28
+ - Якщо `worktree` має значення `true`, поле `requireRoot` не використовується.
29
+ - Не використовує кеш.
30
+ - Не кидає винятків.
31
+ - Гарантує, що `meta.json` є єдиним джерелом правди для скілу.
@@ -0,0 +1,31 @@
1
+ # sync-gitignore-worktree.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл забезпечує, що кореневий `.gitignore` проєкту ігнорує локальні git-worktree. Він гарантує, що всі артефакти, пов'язані з worktree, правильно включені в `.gitignore`, забезпечуючи консистентність та уникнення непередбачуваних проблем. Це ключовий компонент системи завжди-активного flow/worktree-tooling.
6
+
7
+ ## Поведінка
8
+
9
+ 1. Визначає корінь проєкту.
10
+ 2. Перевіряє наявність в кореневому файлі `.gitignore` запису, що відповідає каталогу `.worktrees/`.
11
+ 3. Якщо запису немає, викликає утиліту для додавання запису `.worktrees/` до `.gitignore`.
12
+ 4. Утиліта додає запис, якщо його ще немає, інакше не робить нічого.
13
+ 5. Повертає значення `true`, якщо запис було додано, інакше `false`.
14
+
15
+ ## Публічний API
16
+
17
+ syncGitignoreWorktree — Синхронізує файл `.gitignore` в каталозі `worktrees` з кореневим файлом `.gitignore`.
18
+
19
+ ## Гарантії поведінки
20
+
21
+ - Гарантує, що кореневий `.gitignore` проєкту ігнорує локальні git-worktree (`.worktrees/`).
22
+ - Викликається з дефолтного sync (`npx \@nitra/cursor`) окремим top-level кроком.
23
+ - Не викликається в контексті `syncClaudeConfig`.
24
+ - `.worktrees/` є артефактом завжди-активного flow/worktree-tooling.
25
+ - Один запис `.worktrees/` покриває каталог worktree та всі sibling-файли в ньому.
26
+ - Запис безумовний, без гейта за `.n-cursor.json`-правилами.
27
+ - Продюсер артефактів — завжди-активний flow.
28
+ - Делегує наявній idempotent+append-only утиліті `ensureGitignoreEntries`.
29
+ - `ensureGitignoreEntries` не перезаписує/не видаляє наявні рядки.
30
+ - `ensureGitignoreEntries` створює `.gitignore`, якщо нема.
31
+ - Не використовує кешування.
@@ -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
+ - Функції не використовують жодного кешу.