@nitra/cursor 5.3.3 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/.claude-template/settings.template.json +2 -2
  2. package/.pi-template/extensions/n-cursor-adr/docs/index.md +13 -24
  3. package/CHANGELOG.md +17 -0
  4. package/bin/n-cursor.js +43 -22
  5. package/lib/docs/llm.md +23 -12
  6. package/lib/docs/models.md +29 -18
  7. package/lib/docs/omlx-trace.md +51 -0
  8. package/lib/docs/omlx.md +31 -15
  9. package/lib/omlx.mjs +2 -5
  10. package/package.json +1 -1
  11. package/rules/abie/docs/fix.md +17 -11
  12. package/rules/adr/docs/fix.md +25 -140
  13. package/rules/bun/docs/fix.md +18 -151
  14. package/rules/capacitor/docs/fix.md +16 -13
  15. package/rules/capacitor/js/docs/platforms.md +31 -43
  16. package/rules/changelog/docs/fix.md +25 -169
  17. package/rules/ci4/docs/fix.md +11 -14
  18. package/rules/doc-files/doc-files.mdc +60 -0
  19. package/rules/doc-files/docs/fix.md +31 -0
  20. package/rules/doc-files/fix.mjs +19 -0
  21. package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
  22. package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
  23. package/{skills → rules}/doc-files/js/docgen-scan.mjs +9 -1
  24. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  25. package/rules/doc-files/js/docs/docgen-extract-anchors.md +45 -0
  26. package/rules/doc-files/js/docs/docgen-extract.md +39 -0
  27. package/rules/doc-files/js/docs/docgen-files-batch.md +35 -0
  28. package/rules/doc-files/js/docs/docgen-gen.md +46 -0
  29. package/rules/doc-files/js/docs/docgen-ignore.md +37 -0
  30. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  31. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  32. package/rules/doc-files/js/docs/lint.md +36 -0
  33. package/rules/doc-files/js/docs/units-js.md +31 -0
  34. package/rules/doc-files/js/docs/units-rs.md +35 -0
  35. package/rules/doc-files/js/docs/units.md +30 -0
  36. package/rules/doc-files/js/lint.mjs +96 -0
  37. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  38. package/rules/doc-files/lint/docs/lint.md +37 -0
  39. package/rules/doc-files/lint/lint.mjs +105 -0
  40. package/rules/doc-files/meta.json +1 -0
  41. package/rules/docker/docs/fix.md +21 -161
  42. package/rules/efes/docs/fix.md +23 -194
  43. package/rules/feedback/docs/fix.md +10 -8
  44. package/rules/ga/docs/fix.md +10 -5
  45. package/rules/graphql/docs/fix.md +23 -119
  46. package/rules/hasura/docs/fix.md +19 -5
  47. package/rules/hasura/js/docs/internal_urls.md +34 -307
  48. package/rules/image-avif/docs/fix.md +16 -127
  49. package/rules/image-compress/docs/fix.md +20 -141
  50. package/rules/image-compress/js/docs/package_setup.md +22 -182
  51. package/rules/js-bun-db/docs/fix.md +23 -139
  52. package/rules/js-bun-db/js/docs/safety.md +33 -221
  53. package/rules/js-bun-redis/docs/fix.md +25 -114
  54. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  55. package/rules/js-lint/docs/fix.md +30 -108
  56. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  57. package/rules/js-lint/js/docs/lint.md +22 -238
  58. package/rules/js-lint/js/docs/tooling.md +34 -331
  59. package/rules/js-lint-ci/docs/fix.md +16 -149
  60. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  61. package/rules/js-mssql/docs/fix.md +18 -123
  62. package/rules/js-mssql/js/docs/deps.md +28 -251
  63. package/rules/js-run/docs/fix.md +23 -138
  64. package/rules/js-run/js/docs/runtime.md +24 -378
  65. package/rules/k8s/docs/fix.md +18 -123
  66. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  67. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  68. package/rules/npm-module/docs/fix.md +27 -89
  69. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  70. package/rules/npm-module/js/docs/package_structure.md +36 -258
  71. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  72. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  73. package/rules/php/docs/fix.md +21 -98
  74. package/rules/php/js/docs/tooling.md +20 -143
  75. package/rules/python/docs/fix.md +25 -157
  76. package/rules/python/js/docs/applies.md +20 -98
  77. package/rules/python/js/docs/tooling.md +27 -144
  78. package/rules/rego/docs/fix.md +24 -112
  79. package/rules/rego/js/docs/applies.md +20 -164
  80. package/rules/rego/js/docs/lint.md +15 -110
  81. package/rules/release/docs/fix.md +16 -114
  82. package/rules/rust/docs/fix.md +24 -119
  83. package/rules/rust/js/docs/applies.md +20 -129
  84. package/rules/security/docs/fix.md +21 -78
  85. package/rules/security/js/docs/sample_secret.md +23 -182
  86. package/rules/security/js/docs/trufflehog.md +19 -128
  87. package/rules/style-lint/docs/fix.md +16 -150
  88. package/rules/style-lint/js/docs/lint.md +21 -172
  89. package/rules/style-lint/js/docs/tooling.md +19 -184
  90. package/rules/tauri/docs/fix.md +26 -152
  91. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  92. package/rules/tauri/js/docs/tooling.md +20 -217
  93. package/rules/test/docs/fix.md +19 -127
  94. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  95. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  96. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  97. package/rules/test/js/docs/location.md +24 -126
  98. package/rules/test/js/docs/no-process-chdir.md +20 -151
  99. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  100. package/rules/test/js/docs/stryker_config.md +48 -148
  101. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  102. package/rules/text/docs/fix.md +25 -113
  103. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  104. package/rules/text/js/docs/formatting.md +60 -251
  105. package/rules/text/js/docs/lint.md +17 -114
  106. package/rules/vue/docs/fix.md +25 -118
  107. package/rules/vue/js/docs/packages.md +25 -323
  108. package/rules/worktree/docs/fix.md +31 -150
  109. package/scripts/coverage-classify/docs/index.md +23 -209
  110. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  111. package/scripts/dispatcher/docs/trace.md +35 -0
  112. package/scripts/docs/auto-rules.md +37 -361
  113. package/scripts/docs/lint-cli.md +12 -13
  114. package/scripts/docs/post-tool-use-fix.md +16 -15
  115. package/scripts/docs/skills-cli.md +26 -23
  116. package/scripts/docs/sync-claude-config.md +94 -34
  117. package/scripts/docs/worktree-cli.md +11 -34
  118. package/scripts/lib/docs/assert-project-root.md +14 -16
  119. package/scripts/lib/docs/changed-files.md +24 -139
  120. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  121. package/scripts/lib/docs/rule-predicates.md +20 -17
  122. package/scripts/lib/docs/run-rule-cli.md +14 -18
  123. package/scripts/lib/docs/run-rule.md +13 -20
  124. package/scripts/lib/docs/run-standard-rule.md +12 -15
  125. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  126. package/scripts/lib/rule-predicates.mjs +1 -1
  127. package/scripts/sync-claude-config.mjs +4 -1
  128. package/scripts/utils/docs/with-lock.md +19 -12
  129. package/scripts/utils/with-lock.mjs +4 -2
  130. package/skills/doc-aggregate/SKILL.md +2 -2
  131. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  132. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  133. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  134. package/skills/doc-files/.changes/260612-0012.md +5 -0
  135. package/skills/doc-files/.changes/260612-0031.md +5 -0
  136. package/skills/doc-files/.changes/260612-0036.md +5 -0
  137. package/skills/doc-files/.changes/260612-0114.md +5 -0
  138. package/skills/doc-files/SKILL.md +6 -6
  139. package/skills/fix/js/docs/llm-worker.md +17 -15
  140. package/skills/fix/js/docs/orchestrator.md +30 -23
  141. package/skills/fix/js/docs/t0.md +26 -16
  142. package/skills/start-check/js/docs/check.md +26 -22
  143. package/skills/taze/js/docs/diff.md +44 -20
  144. package/skills/doc-files/js/docs/docgen-extract-anchors.md +0 -27
  145. package/skills/doc-files/js/docs/docgen-extract.md +0 -29
  146. package/skills/doc-files/js/docs/docgen-files-batch.md +0 -25
  147. package/skills/doc-files/js/docs/docgen-gen.md +0 -30
  148. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  149. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  150. package/skills/doc-files/js/docs/units-rs.md +0 -35
  151. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  152. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  153. /package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +0 -0
  154. /package/{skills → rules}/doc-files/js/docgen-gen.mjs +0 -0
  155. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  156. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  157. /package/{skills → rules}/doc-files/js/units.mjs +0 -0
@@ -1,52 +1,112 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/sync-claude-config.mjs
4
+ crc: ad7b8440
5
+ score: 95
6
+ ---
7
+
1
8
  # sync-claude-config.mjs
2
9
 
3
10
  ## Огляд
4
11
 
5
- Цей файл синхронізує конфігурацію Claude Code з шаблонів пакету `npm/.claude-template`, включаючи налаштування, slash-команди та хуки. Він забезпечує узгодженість між проєктом та базовою конфігурацією, автоматично оновлюючи та підтримуючи налаштування хуків та команд. Це дозволяє використовувати стандартні налаштування та автоматично адаптувати проєкт до змін у шаблоні.
12
+ Файл синхронізує конфігурацію Claude Code (`.claude/settings.json`), slash-команди з темплейту та Cursor hooks (`.cursor/hooks.json`) у поточний проєкт з використанням темплейтів пакету `npm/.claude-template/`. Він виконує злиття користувацьких полів, дозволів та хуків з різних джерел. Синхронізуються та видаляються залежні скрипти та фрагменти конфігурації.
6
13
 
7
14
  ## Поведінка
8
15
 
9
- - `parseGitignoreFragmentLines`: Розбиває рядок фрагменту `.gitignore` на окремі рядки, видаляє порожні та коментарні рядки.
10
- - `syncGitignoreAdrFragment`: Дописує відсутні рядки з канонічного фрагменту `.gitignore` у `.gitignore` проєкту.
11
- - `syncClaudeCommands`: Копіює slash-команди з `commands/` темплейту в `.claude/commands/*.md`.
12
- - `syncClaudeSettings`: Об'єднує конфігурацію Claude Code з темплейту, зберігаючи користувацькі налаштування та перезаписуючи хуки, що ідентифікуються маркерами.
13
- - `syncCursorHooksConfig`: Об'єднує конфігурацію хуків Cursor з темплейту, додаючи або видаляючи хуки ADR Stop-hook залежно від наявності правила `adr`.
14
- - `syncAdrHookScript`: Копіює bash-скрипт ADR capture Stop-hook з темплейту в `.claude/hooks/capture-decisions.sh`.
15
- - `syncAdrNormalizeHookScript`: Копіює bash-скрипт ADR normalize Stop-hook з темплейту в `.claude/hooks/normalize-decisions.sh`.
16
- - `syncAdrHookLibScripts`: Копіює bash-скрипти lib-файлів з `commands/` темплейту в `.claude/hooks/lib/`.
17
- - `removeOrphanAdrHookLib`: Видаляє директорію lib-файлів з `.claude/hooks/lib/`, якщо правило `adr` вимкнено.
18
- - `syncPiExtensions`: Копіює розширення TypeScript з `npm/.pi-template/extensions/n-cursor-adr/` в `.pi/extensions/n-cursor-adr/`.
19
- - `removeOrphanPiExtension`: Видаляє директорію розширення TypeScript з `.pi/extensions/n-cursor-adr/`, якщо правило `adr` вимкнено.
20
- - `syncClaudeConfig`: Синхронізує конфігурацію Claude Code та Cursor hooks, об'єднуючи їх та додаючи/видаляючи хуки
16
+ MANAGED_HOOK_COMMAND_MARKER Маркер PostToolUse fix-hook
21
17
 
22
- ## Публічний API
18
+ DOC_FILES_HOOK_COMMAND_MARKER Маркер doc-files staleness-hook
23
19
 
24
- - MANAGED_HOOK_COMMAND_MARKER — Маркер для фіксації хуків PostToolUse.
25
- - LEGACY_STOP_HOOK_COMMAND_MARKER — Маркер для legacy-хуків Stop, використовується під час оновлення.
26
- - ADR_HOOK_COMMAND_MARKER — Маркер для хуків ADR Stop, визначає шлях до скрипту capture-decisions.
27
- - ADR_NORMALIZE_HOOK_COMMAND_MARKER — Маркер для хуків ADR Stop, визначає шлях до скрипту normalize-decisions.
28
- - CURSOR_ADR_HOOK_COMMAND_MARKER — Маркер для хуків Cursor ADR Stop, шлях до скрипту в `.cursor/hooks.json`.
29
- - CURSOR_ADR_NORMALIZE_HOOK_COMMAND_MARKER — Маркер для хуків Cursor ADR Normalize Stop, шлях до скрипту в `.cursor/hooks.json`.
30
- - MANAGED_HOOK_COMMAND_MARKERS — Усі маркери managed-хуків пакета.
31
- - PI_DIR — Корінь артефактів pi.dev у проєкті-споживачі.
32
- - PI_EXTENSIONS_DIR — Директорія pi.dev TS-extensions у проєкті-споживачі.
33
- - PI_TEMPLATE_DIR_NAME — Назва bundled-директорії pi-template у пакеті `@nitra/cursor`.
34
- - PI_EXTENSION_NAME — Ім'
20
+ LEGACY_STOP_HOOK_COMMAND_MARKER Маркер старого Stop-hook
35
21
 
36
- ## Гарантії поведінки
22
+ ADR_HOOK_COMMAND_MARKER Маркер ADR Stop-hook
23
+
24
+ ADR_NORMALIZE_HOOK_COMMAND_MARKER Маркер ADR Stop-hook
25
+
26
+ CURSOR_ADR_HOOK_COMMAND_MARKER Маркер Cursor ADR Stop-hook
27
+
28
+ CURSOR_ADR_NORMALIZE_HOOK_COMMAND_MARKER Маркер Cursor ADR Normalize Stop-hook
29
+
30
+ MANAGED_HOOK_COMMAND_MARKERS Маркерів для відрізнення managed-hook'ів
31
+
32
+ PI_DIR Корінь pi.dev артефактів
33
+
34
+ PI_EXTENSIONS_DIR Директорія pi.dev TS-extensions
35
+
36
+ PI_TEMPLATE_DIR_NAME Назва bundled-директорії pi-template
37
+
38
+ PI_EXTENSION_NAME Імʼя bundled pi-extension'а
39
+
40
+ ADR_GITIGNORE_SNIPPET_REL Відносний шлях до канонічного фрагмента `.gitignore` для ADR Stop-hook'ів
41
+
42
+ mergeAllowList Зливає список allow-permissions без дублікатів
37
43
 
38
- Немає кешування.
44
+ mergeHooks Зливає hooks-секцію, видаляючи managed-групи з існуючої конфігурації
39
45
 
40
- Функція повертає `true`, якщо синхронізація завершилася успішно.
46
+ mergeSettings Зливає конфігурацію Claude, перевіряючи та зливаючи permissions та hooks
41
47
 
42
- Якщо `claude-config` встановлено на `false` у `.n-cursor.json`, функція не змінює конфігурацію Claude.
48
+ mergeCursorHooksConfig Зливає конфігурацію Cursor, керуючи додаванням/видаленням ADR stop entries
43
49
 
44
- `settings.json` оновлюється шляхом об'єднання конфігурації з `.claude-template/settings.json`, де перекриваються команди, що містять `MANAGED_HOOK_COMMAND_MARKER`, дозволи `permissions.allow` об'єднуються, і правила `adr` додаються/видаляються згідно з їх статусом у `.n-cursor.json`.
50
+ syncCursorHooksConfig Синхронізує `.cursor/hooks.json` для Cursor Agent stop-hooks
45
51
 
46
- `.claude/commands/*.md` оновлюється шляхом повного заміщення вмісту з `.claude-template/commands/`.
52
+ syncClaudeSettings Синхронізує `.claude/settings.json` за темплейтом
47
53
 
48
- `.claude/hooks/capture-decisions.sh` оновлюється шляхом повного копіювання з `.claude-template/hooks/` лише тоді, коли правило `adr` увімкнено в `.n-cursor.json`.
54
+ syncAdrHookScript Копіює канонічний bash-скрипт ADR capture Stop-hook з темплейту
49
55
 
50
- `.claude/hooks/normalize-decisions.sh` оновлюється шляхом повного копіюювання з `.claude-template/hooks/` лише тоді, коли правило `adr` увімкнено в `.n-cursor.json`.
56
+ syncAdrNormalizeHookScript Копіює канонічний bash-скрипт ADR normalize Stop-hook з темплейту
57
+
58
+ syncAdrHookLibScripts Копіює `.sh`-файли з `.claude-template/hooks/lib/` у `.claude/hooks/`
59
+
60
+ removeOrphanAdrHookLib Видаляє директорію `.claude/hooks/lib/` з проєкту-споживача
61
+
62
+ syncPiExtensions Копіює bundled pi.dev TS-extension з пакета у проєкт
63
+
64
+ removeOrphanPiExtension Видаляє директорію `.pi/extensions/n-cursor-adr/` з проєкту-споживача
65
+
66
+ syncGitignoreAdrFragment Дописує відсутні рядки з канонічного ADR-фрагмента до кореневого `.gitignore` проєкту
67
+
68
+ syncClaudeCommands Копіює slash-команди з `commands/` темплейту у `.claude/commands/`
69
+
70
+ syncClaudeConfig Виконує повну синхронізацію Claude Code-конфігу з темплейту
71
+
72
+ ## Публічний API
73
+
74
+ MANAGED_HOOK_COMMAND_MARKER — Маркер для хуків PostToolUse fix-hook'а (`npx --no @nitra/cursor post-tool-use-fix`).
75
+ DOC_FILES_HOOK_COMMAND_MARKER — Маркер для хуків doc-files staleness-hook'ів (PostToolUse `--hook` та Stop-гейт `--git`).
76
+ LEGACY_STOP_HOOK_COMMAND_MARKER — Маркер для старого Stop-hook'а — для очищення при оновленні існуючих інсталяцій.
77
+ ADR_HOOK_COMMAND_MARKER — Маркер для ADR Stop-hook'а — підрядок шляху до bash-скрипта capture-decisions.sh.
78
+ ADR_NORMALIZE_HOOK_COMMAND_MARKER — Маркер для ADR Stop-hook'а — підрядок шляху до bash-скрипта normalize-decisions.sh.
79
+ CURSOR_ADR_HOOK_COMMAND_MARKER — Маркер для Cursor ADR Stop-hook'а — той самий script path, але в `.cursor/hooks.json`.
80
+ CURSOR_ADR_NORMALIZE_HOOK_COMMAND_MARKER — Маркер для Cursor ADR Stop-hook'а — той самий script path, але в `.cursor/hooks.json`.
81
+ MANAGED_HOOK_COMMAND_MARKERS — Група маркерів managed-hook'ів пакета — відрізняються від користувацьких.
82
+ Legacy stop-hook включений сюди, щоб старі entries автоматично видалялись при наступному sync-у.
83
+ PI_DIR — Корінь артефактів pi.dev у проєкті-споживачі.
84
+ PI_EXTENSIONS_DIR — Директорія TS-розширень pi.dev у проєкті-споживачі.
85
+ PI_TEMPLATE_DIR_NAME — Назва bundled-директорії pi-template у пакеті `@nitra/cursor`.
86
+ PI_EXTENSION_NAME — Імʼя bundled pi-extension'а для ADR capture/normalize.
87
+ ADR_GITIGNORE_SNIPPET_REL — Відносний шлях до канонічного фрагмента `.gitignore` для ADR Stop-hook'ів у tarball пакета.
88
+ mergeAllowList — Зливає список allow-permissions: об'єднує існуючі та темплейтні дозволи без дублікатів, зберігаючи користувацький порядок.
89
+ mergeHooks — Зливає hooks-секцію. Видаляє managed-групи з існуючої конфігурації та дописує managed-групи з темплейту. Перебір подій union-у враховує зміну порядку хуків.
90
+ mergeSettings — Повертає об'єднаний об'єкт settings.json.
91
+ mergeCursorHooksConfig — Зливає `.cursor/hooks.json`: користувацькі записи зберігаються, managed ADR записи в `hooks.stop` перезаписуються або видаляються залежно від `includeAdrHook`.
92
+ syncCursorHooksConfig — Синхронізує `.cursor/hooks.json` для Cursor Agent stop-hooks. Cursor читає project-level config з `.cursor/hooks.json`; хук-скрипти залишаються спільними з Claude Code у `.claude/hooks/`.
93
+ syncClaudeSettings — Синхронізує `.claude/settings.json` за темплейтом, зберігаючи решту користувацьких полів.
94
+ syncAdrHookScript — Копіює канонічний `.claude/hooks/capture-decisions.sh` з темплейту пакета.
95
+ syncAdrNormalizeHookScript — Копіює канонічний `.claude/hooks/normalize-decisions.sh` з темплейту пакета.
96
+ syncAdrHookLibScripts — Копіює всі `.sh`-файли з `.claude-template/hooks/lib/` у `.claude/hooks/lib/` проєкту.
97
+ Файли source-only (без exec bit) — їх source-ять capture/normalize-decisions.sh, щоб уникнути дублювання спільної bash-логіки (`is_tooling_only_change`, `git_diff_only_version_field`).
98
+ Тека fully-owned — при кожному sync-у перезаписується.
99
+ removeOrphanAdrHookLib — Видаляє директорію `.claude/hooks/lib/` з проєкту-споживача. Викликається, коли правило `adr` вимкнено — бібліотечні файли не самостійні, і їх не потрібні.
100
+ syncPiExtensions — Копіює bundled pi.dev TS-extension `npm/.pi-template/extensions/n-cursor-adr/` (всі файли — `index.ts`, `tsconfig.json`, потенційні `package.json`/`.gitignore` тощо`) у `.pi/extensions/n-cursor-adr/` проєкту-споживача. Тека fully-owned: при кожному sync-у перезаписується. Якщо bundled template відсутній (legacy-версії пакета без `.pi-template/`) або в ньому немає `index.ts` — повертається `{written: false}` без помилки.
101
+ Розширення поверх `index.ts` (tsconfig тощо) потрібні, бо `.pi/extensions/` синхронізується як у проєкти-споживачі, а IDE/TS-сервер мусить резолвити `node:*` модулі без додаткових project-wide конфігів.
102
+ removeOrphanPiExtension — Видаляє директорію `.pi/extensions/n-cursor-adr/` з проєкту-споживача. Викликається, коли правило `adr` вимкнено у `.n-cursor.json` — бібліотечні файли не самостійні, і їх не потрібні (симетрично до cleanup-у `.claude/hooks/{capture,normalize}-decisions.sh`).
103
+ syncGitignoreAdrFragment — Дописує в кореневий `.gitignore` проєкту відсутні рядки з канонічного ADR-фрагмента.
104
+ syncClaudeCommands — Копіює всі slash-команди з `templateDir/commands/` у `.claude/commands/`. Команди ідентифікуються тим, що вони лежать у темплейті — не перетинаються з командами скілів (n-fix, n-lint, ...).
105
+ syncClaudeConfig — Виконує повну синхронізацію Claude Code-конфігу з темплейту пакету в проєкт. Використовується з `bin/n-cursor.js` після інших синків.
106
+
107
+ ## Гарантії поведінки
51
108
 
52
- `.
109
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
110
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
111
+ - Свідомо пропускає шляхи: `.git`.
112
+ - Не звертається до мережі.
@@ -1,52 +1,29 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/scripts/worktree-cli.mjs
4
- crc: 92deb344
4
+ crc: 4fb54376
5
+ score: 100
5
6
  ---
6
7
 
7
8
  # worktree-cli.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл `n-cursor worktree` є CLI-оркестратором для управління git worktree. Він дозволяє додавати, видаляти та перевіряти worktree, забезпечуючи зручний інтерфейс для роботи з декількома гілками в одному репозиторії. Цей інструмент використовується для організації робочого процесу розробника, що працює з кількома гілками.
12
+ Файл є CLI-оркестратором `worktree-tool` для керування конвенцією `.worktrees/`. Він забезпечує виконання Git-операцій для додавання, видалення, перегляду та прибирання робочих просторів.
12
13
 
13
14
  ## Поведінка
14
15
 
15
- 1. **Ініціалізація:** Отримує аргументи командного рядка, включаючи підкоманду та її параметри. Визначає поточний робочий каталог, якщо його не вказано. Ініціалізує контекст для логування та отримання дати.
16
- 2. **Розбір підкоманди:** Визначає, яку підкоманду було передано. Залежно від підкоманди, виконує відповідні дії.
17
- 3. **`add` (Створення нового worktree):**
18
- - Перевіряє наявність необхідних параметрів: назви гілки та опису.
19
- - Визначає унікальну назву гілки, якщо вона вже існує.
20
- - Створює новий worktree, використовуючи вказану гілку та опис. Записує опис у файл `.md` у каталозі `.worktrees/`.
21
- - Створює нагадування про незакомічені зміни основного дерева, якщо це необхідно.
22
- 4. **`remove` (Видалення worktree):**
23
- - Перевіряє наявність необхідного параметра: назви гілки.
24
- - Видаляє checkout та файл `.md` для вказаної гілки.
25
- - Видаляє всі осиротілі файли опису, які залишилися після видалення гілки.
26
- - Не створює і не обслуговує окремі sibling runtime-файли.
27
- 5. **`list` (Перелік worktree):**
28
- - Виводить список всіх створених worktree, отриманий за допомогою команди `git worktree list`.
29
- - Для кожного worktree виводить його повний шлях та вміст файлу опису `.md`.
30
- 6. **`prune` (Видалення осиротілих worktree):**
31
- - Визначає всі файли опису `.md`, які більше не пов'язані з жодною зареєстрованою гілкою worktree.
32
- - Видаляє ці осиротілі файли опису.
33
- 7. \*\*Викона
16
+ 1. Запуск підкоманди add. Перевіряється наявність необхідного імені гілки та опису. Перевіряється унікальність назви для створення нового worktree. Збирається нагадування про незакомічені зміни основного дерева. Виконується git команда для створення worktree. Якщо команда не успішна, повертається помилка. Створюється та записується опис у файлі `.worktrees/`. Повертається код виходу.
17
+ 2. Запуск підкоманди remove. Перевіряється наявність імені гілки. Перевіряється наявність необхідного імені гілки. Визначається шлях до worktree. Виконується git команда для видалення checkout. Якщо команда не успішна, повертається помилка. Якщо вказано прапорець --force, використовується примусовий режим. Видаляється відповідний файл опису. Повертається код виходу.
18
+ 3. Запуск підкоманди list. Виконується git команда для отримання списку worktree. Виводиться результат. Для кожного зареєстрованого файлу опису з директорії `.worktrees/` зчитується вміст файлу та виводиться. Повертається код виходу.
19
+ 4. Запуск підкоманди prune. Виконується git команда для прибирання worktree. Визначається список осиротілих файлів опису. Виконується git команда для прибирання worktree. Для кожного осиротілого файлу опису видаляється відповідний файл. Повертається код виходу.
34
20
 
35
21
  ## Публічний API
36
22
 
37
- runWorktreeCli — Запускає підкоманду worktree.
23
+ runWorktreeCli — Запускає команду для роботи з підкомандою worktree.
38
24
 
39
25
  ## Гарантії поведінки
40
26
 
41
- - `runWorktreeCli` повертає `false` при будь-якій помилці.
42
- - `runWorktreeCli` повертає `null` при помилці, якщо результат неможливо визначити.
43
- - Немає кешування.
44
- - `add <branch> "<опис>"` створює гілку `worktree` з описом.
45
- - `remove <branch> [--force]` видаляє checkout гілки `worktree`, але не видаляє саму гілку.
46
- - `list` виводить список всіх `worktree`.
47
- - `prune` видаляє `worktree` без checkout.
48
- - Немає гарантій щодо стану git-репозиторію.
49
- - Немає гарантій щодо наявності незакомічених змін.
50
- - Немає гарантій щодо наявності осиротілих `worktree`.
51
- - `runWorktreeCli` не кидає винятків.
52
- - Помилки переховуються.
27
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
28
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
29
+ - Не звертається до мережі.
@@ -1,34 +1,32 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/scripts/lib/assert-project-root.mjs
4
- crc: 3ad7981a
4
+ crc: adb87c16
5
+ score: 100
5
6
  ---
6
7
 
7
8
  # assert-project-root.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл забезпечує захист від непередбачуваної поведінки при запуску `npx @nitra/cursor` з піддиректорій git-репозиторію. Він гарантує, що процес синхронізації та встановлення артефактів виконується лише з кореневої директорії проєкту, запобігаючи розповсюдженню конфігураційних файлів у невідповідні місця. Це забезпечує узгодженість та передбачуваність процесу налаштування проєкту.
12
+ Файл перевіряє розташування поточного каталогу відносно кореня git-репозиторію. Функції надають доступ до шляху кореня репозиторію та перевірку, чи знаходиться поточний каталог саме в цьому корені. Код спирається на конфіги, визначені у `.n-cursor.json`.
12
13
 
13
14
  ## Поведінка
14
15
 
15
- gitToplevel: Визначає реальний шлях кореня git-репозиторію, використовуючи `git rev-parse --show-toplevel`. Повертає `null`, якщо `git` недоступний або не вдалося визначити корінь.
16
- safeRealpath: Повертає реальний шлях вказаного каталогу, ігноруючи символічні посилання. Якщо шлях не існує, повертає вихідний шлях без змін.
17
- assertCwdIsProjectRoot: Перевіряє, чи поточний робочий каталог є коренем git-репозиторію. Якщо так, функція не робить нічого. Якщо каталог знаходиться всередині git-репозиторію, але не є його коренем, викидає помилку, що інформує про необхідність перейти в корінь репозиторію.
16
+ gitToplevel
17
+ Повертає абсолютний шлях до кореня git-репозиторію або null, якщо git недоступний або не повертає кореня.
18
+
19
+ assertCwdIsProjectRoot
20
+ Перевіряє, чи знаходиться поточний каталог у корені git-репозиторію. Кидає помилку, якщо каталог знаходиться всередині репозиторію, але не в корені. Пропускає перевірку, якщо git не знаходить кореня.
18
21
 
19
22
  ## Публічний API
20
23
 
21
- - gitToplevel — Отримує реальний шлях кореня git-репозиторію, використовуючи `git rev-parse --show-toplevel`. Повертає шлях або `null`, якщо `dir` не є коренем репозиторію або `git` недоступний.
22
- - assertCwdIsProjectRoot — Перевіряє, чи `dir` є коренем git-репозиторію. Якщо `dir` є піддиректорією репозиторію або знаходиться поза репозиторієм (без визначення `toplevel`), то функція пропускає операцію без помилки.
24
+ - gitToplevel — повертає шлях до кореня git-репозиторію через `git rev-parse --show-toplevel`. Повертає `null`, якщо `dir` не є частиною git-репозиторію або `git` недоступний.
25
+ - assertCwdIsProjectRoot — генерує помилку, якщо `dir` знаходиться у піддиректорії git-репозиторію. Пропускає, якщо `toplevel` відсутній (наприклад, у `git-worktree`), дозволяючи запуск.
23
26
 
24
27
  ## Гарантії поведінки
25
28
 
26
- - При запуску `npx @nitra/cursor` з кореня будь-якого git-репозиторію, виконується синхронізація проєкту.
27
- - При запуску `npx @nitra/cursor` з піддиректорії git-репозиторію, `cwd` встановлюється на корінь git-репозиторію.
28
- - Синхронізація проєкту включає створення та запуск сценаріїв для `.cursor/rules/`, `.cursor/skills/`, `.claude/`, `AGENTS.md`, `CLAUDE.md`, `.n-cursor.json`, `.gitignore`.
29
- - Синхронізація проєкту включає запуск `bun install`.
30
- - При невдачі синхронізації повертається `false` або `null`.
31
- - Немає кешування.
32
- - Не перехоплює винятки.
33
- - Функція `gitToplevel` забезпечує доступ до кореня git-репозиторію.
34
- - Функція `assertCwdIsProjectRoot` перевіряє, чи поточний `cwd` є коренем git-репозиторію.
29
+ - Read-only: файл не виконує операцій запису у файлову систему.
30
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
31
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
32
+ - Не звертається до мережі.
@@ -1,149 +1,34 @@
1
+ ---
2
+ docgen:
3
+ source: npm/scripts/lib/changed-files.mjs
4
+ crc: 8148d84e
5
+ score: 100
6
+ ---
7
+
1
8
  # changed-files.mjs
2
9
 
3
10
  ## Огляд
4
11
 
5
- Модуль `changed-files.mjs` допоміжна бібліотека для збору переліку змінених файлів у робочому дереві git-репозиторію. Використовується lint-оркестратором у quick-режимі та `coverage --changed` для визначення scope-у файлів, на яких потрібно прогнати перевірки.
6
-
7
- Логіка модуля:
8
-
9
- - збирає tracked-modified та staged файли через `git diff` (з `--diff-filter=ACMR`, тобто Added/Copied/Modified/Renamed — без Deleted);
10
- - додає untracked файли через `git ls-files --others --exclude-standard` (з повагою до `.gitignore`);
11
- - дедуплікує об'єднаний список через `Set`;
12
- - повертає relative-posix шляхи відносно `cwd`;
13
- - поза git-репо або при помилці git мовчки повертає порожній список (для `gitLines`);
14
- - для режиму "since base" — fail-closed: якщо базовий комміт недосяжний, кидає явну помилку, щоб gate не пройшов мовчки.
15
-
16
- Видалені файли свідомо не включаються — лінтити неіснуючий файл немає сенсу.
17
-
18
- ## Експорти / API
19
-
20
- Модуль експортує дві функції:
21
-
22
- | Експорт | Тип | Призначення |
23
- | -------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
24
- | `collectChangedFiles` | `(cwd?: string) => string[]` | Список змінених + untracked файлів робочого дерева відносно `HEAD`. |
25
- | `collectChangedFilesSince` | `(base: string \| null, cwd?: string) => string[]` | Список змінених + untracked файлів **відносно довільного базового комміту**. Без `base` — fallback на `collectChangedFiles`. |
26
-
27
- Внутрішня (неекспортована) функція:
28
-
29
- | Внутрішнє | Тип | Призначення |
30
- | ---------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------- |
31
- | `gitLines` | `(args: string[], cwd: string) => string[]` | Виконує `git <args>` у `cwd` і повертає непорожні trim-нуті рядки stdout або `[]` при помилці. |
32
-
33
- ## Функції
34
-
35
- ### `gitLines(args, cwd)` (internal)
36
-
37
- Виклик git-команди з парсингом stdout у масив рядків.
38
-
39
- - **Сигнатура:** `function gitLines(args: string[], cwd: string): string[]`
40
- - **Параметри:**
41
- - `args` — масив аргументів для `git` (наприклад `['diff', 'HEAD', '--name-only']`).
42
- - `cwd` — робоча директорія для процесу `git`.
43
- - **Повертає:** масив непорожніх рядків stdout (після `trim`). Якщо `r.status !== 0` або є `r.error` — повертає `[]`.
44
- - **Side effects:**
45
- - Синхронно спавнить процес `git` через `spawnSync` з `node:child_process`;
46
- - не пише в stdout/stderr батьківського процесу (всі потоки збираються через `encoding: 'utf8'`);
47
- - не кидає винятків — fail-silent.
48
-
49
- ### `collectChangedFiles(cwd?)`
50
-
51
- Збирає список змінених + untracked файлів робочого дерева відносно `HEAD`.
52
-
53
- - **Сигнатура:** `function collectChangedFiles(cwd?: string): string[]`
54
- - **Параметри:**
55
- - `cwd` (опційно, дефолт `process.cwd()`) — корінь git-репо.
56
- - **Алгоритм:**
57
- 1. `git diff HEAD --name-only --diff-filter=ACMR` — повертає всі tracked файли, які відрізняються від `HEAD` (staged + unstaged), фільтр `ACMR` відсікає Deleted.
58
- 2. `git ls-files --others --exclude-standard` — повертає untracked файли, які не ігноруються `.gitignore`.
59
- 3. Об'єднання обох списків через `new Set([...modified, ...untracked])` для дедуплікації.
60
- - **Повертає:** `string[]` — унікальні relative-posix шляхи без видалених файлів.
61
- - **Поведінка поза git-репо / при помилці:** `gitLines` мовчки повертає `[]` для обох викликів, тож результат — порожній масив.
62
-
63
- ### `collectChangedFilesSince(base, cwd?)`
64
-
65
- Збирає список змінених + untracked файлів відносно довільного базового комміту. Призначено для сценаріїв, де базовий комміт зафіксовано у стані flow-турнікета (executor комітить кожен крок, тож потрібно ловити зміни «від base», а не «від HEAD»).
66
-
67
- - **Сигнатура:** `function collectChangedFilesSince(base: string | null, cwd?: string): string[]`
68
- - **Параметри:**
69
- - `base` — SHA/ref базового комміту (типово `metadata.base_commit` зі стану flow). Якщо `null`/`undefined`/порожній — fallback на `collectChangedFiles(cwd)`.
70
- - `cwd` (опційно, дефолт `process.cwd()`) — корінь git-репо.
71
- - **Алгоритм:**
72
- 1. Якщо `base` falsy — повертає результат `collectChangedFiles(cwd)`.
73
- 2. Перевіряє досяжність base через `git rev-parse --verify --quiet <base>^{commit}`.
74
- 3. Якщо verify не успішний (`status !== 0` або `error`) — **кидає `Error`** з повідомленням: `collectChangedFilesSince: base-комміт «<base>» недосяжний у <cwd> (rebase/force-update?) — coverage --changed не може визначити scope`.
75
- 4. `git diff <base> --name-only --diff-filter=ACMR` — **без** `..`/`...`, **без** `HEAD`. Така форма порівнює base-комміт із поточним **робочим деревом**, тобто ловить одночасно: закомічене від base, staged та незакомічені модифікації.
76
- 5. `git ls-files --others --exclude-standard` — untracked файли (як у `collectChangedFiles`).
77
- 6. Дедуплікація через `Set`.
78
- - **Повертає:** `string[]` — унікальні relative-posix шляхи без видалених файлів.
79
- - **Контракт fail-closed:** на відміну від `collectChangedFiles`, ця функція **навмисно** не маскує помилку недосяжного base. Інакше `git diff` повернув би exit 128, `gitLines` дав би `[]`, і gate мовчки пройшов би без перевірки — це порушує безпеку coverage-перевірки.
80
- - **Side effects:**
81
- - спавнить два-три git-процеси (один verify + два data-збори, або один fallback);
82
- - може кинути `Error` (єдина точка throw у модулі).
83
-
84
- ## Залежності
85
-
86
- ### Зовнішні (built-in Node.js)
87
-
88
- - `node:child_process` — імпорт `spawnSync` для синхронного виклику git-команд із захопленням stdout.
89
-
90
- ### Системні (runtime)
91
-
92
- - `git` — має бути доступний у `PATH` процесу. За відсутності `gitLines` поверне `[]` (через `r.error`/ненульовий статус).
93
-
94
- ### Внутрішні модулі
95
-
96
- Файл не імпортує жодного локального модуля проєкту (zero-dependency бібліотечний листок).
97
-
98
- ## Потік виконання / Використання
99
-
100
- ### Quick-lint (lint-оркестратор)
101
-
102
- ```js
103
- import { collectChangedFiles } from './changed-files.mjs'
104
-
105
- const files = collectChangedFiles()
106
- // → лінт тільки цих файлів, замість обходу всього монорепо
107
- ```
108
-
109
- Quick-режим прагне мінімізувати IO: лінтить лише те, що користувач щойно змінив у дереві (modified + staged + untracked), ігноруючи решту репо.
110
-
111
- ### Coverage / flow-турнікет
112
-
113
- ```js
114
- import { collectChangedFilesSince } from './changed-files.mjs'
115
-
116
- const base = metadata.base_commit // SHA, зафіксований при старті flow-кроку
117
- const scope = collectChangedFilesSince(base, repoRoot)
118
- // → файли, які змінилися з моменту base, незалежно від того,
119
- // чи їх вже закомічено в проміжних кроках executor-а
120
- ```
121
-
122
- Чому саме `git diff <base>` без `..`/`...`:
123
-
124
- - `git diff A..B` — порівнює дерева A та B, **ігнорує** робоче дерево;
125
- - `git diff A...B` — порівнює B з merge-base(A,B), теж ігнорує робоче дерево;
126
- - `git diff <base>` (один аргумент) — порівнює `<base>` із **робочим деревом** (включно з unstaged змінами).
127
-
128
- Це критично для flow-турнікета, де executor може як комітити проміжні зміни, так і залишати їх unstaged — gate повинен побачити всі зміни від `base` однаково.
129
-
130
- ### Поведінка при недосяжному base
12
+ Файл збирає змінені та незакомічені файли з робочого дерева. Визначає базовий комміт для перевірок у межах зміненого діапазону. Збирає змінені та незакомічені файли відносно базового комміту.
131
13
 
132
- Якщо у репозиторії стався rebase, force-push або shallow clone обрізав історію — `<base>` може стати недосяжним. У такому разі:
14
+ ## Поведінка
133
15
 
134
- - `collectChangedFiles` (без base) поведінка незмінна, працює від `HEAD`;
135
- - `collectChangedFilesSince(base, cwd)` **кидає Error** до того, як викликати `git diff`, щоб coverage-gate явно впав, а не пройшов на порожньому scope.
16
+ collectChangedFiles Збирає змінені та незакомічені файли з робочого дерева.
17
+ resolveChangedBase Визначає базовий комміт для scoped-перевірок.
18
+ collectChangedFilesSince Збирає змінені та незакомічені файли відносно базового комміту.
136
19
 
137
- ### Формат шляхів
20
+ ## Публічний API
138
21
 
139
- Усі повернені шляхи — POSIX-style relative до `cwd` (як їх віддає git за замовчуванням). На Windows git також віддає forward slashes, тож додаткової нормалізації немає.
22
+ - collectChangedFiles: Збирає список змінених та невідстежених файлів з робочого дерева відносно робочого дерева.
23
+ - resolveChangedBase: Визначає базовий комміт для обмежених перевірок без використання зовнішнього стану.
24
+ - Пріоритет: локальна `main`, потім `origin/main`.
25
+ - Якщо обидві відсутні, повертає null, і викликаючий порівнює лише робоче дерево з HEAD.
26
+ - collectChangedFilesSince: Збирає список змінених та невідстежених файлів відносно базового комміту.
27
+ - git diff <base>: Порівнює комміт `base` з поточним робочим деревом (включаючи закомічені та незакомічені модифікації).
28
+ - Якщо `base` відсутній, використовується `collectChangedFiles`.
140
29
 
141
- ### Точки помилок (summary)
30
+ ## Гарантії поведінки
142
31
 
143
- | Сценарій | Поведінка |
144
- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
145
- | Поза git-репо | `collectChangedFiles` → `[]`; `collectChangedFilesSince(null)` → `[]`; `collectChangedFilesSince('SHA')` → `Error` (verify впаде). |
146
- | `git` відсутній у PATH | Усі виклики `gitLines` → `[]`; `collectChangedFilesSince` із `base` → `Error` (verify впаде). |
147
- | `base` досяжний | `collectChangedFilesSince` повертає список (можливо порожній). |
148
- | `base` недосяжний (rebase/force-push/shallow) | `collectChangedFilesSince` кидає `Error`. |
149
- | `base` falsy (`null`/`undefined`/`''`/`0`) | `collectChangedFilesSince` → результат `collectChangedFiles(cwd)`. |
32
+ - Read-only: файл не виконує операцій запису у файлову систему.
33
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
34
+ - Не звертається до мережі.