@nitra/cursor 5.3.4 → 6.0.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 (173) 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 +21 -0
  4. package/bin/n-cursor.js +47 -24
  5. package/lib/docs/models.md +29 -18
  6. package/lib/docs/omlx-trace.md +51 -0
  7. package/lib/docs/omlx.md +31 -15
  8. package/lib/omlx.mjs +2 -5
  9. package/package.json +1 -1
  10. package/rules/abie/docs/fix.md +17 -11
  11. package/rules/adr/docs/fix.md +25 -140
  12. package/rules/bun/docs/fix.md +18 -151
  13. package/rules/capacitor/docs/fix.md +16 -13
  14. package/rules/capacitor/js/docs/platforms.md +31 -43
  15. package/rules/changelog/docs/fix.md +25 -169
  16. package/rules/ci4/docs/fix.md +11 -14
  17. package/rules/doc-files/doc-files.mdc +60 -0
  18. package/rules/doc-files/docs/fix.md +31 -0
  19. package/rules/doc-files/fix.mjs +19 -0
  20. package/{skills → rules}/doc-files/js/docgen-extract.mjs +42 -19
  21. package/{skills → rules}/doc-files/js/docgen-files-batch.mjs +18 -5
  22. package/{skills → rules}/doc-files/js/docgen-gen.mjs +46 -5
  23. package/{skills → rules}/doc-files/js/docgen-ignore.mjs +2 -1
  24. package/{skills → rules}/doc-files/js/docgen-scan.mjs +11 -3
  25. package/{skills → rules}/doc-files/js/docs/docgen-crc.md +1 -1
  26. package/{skills → rules}/doc-files/js/docs/docgen-extract-anchors.md +1 -1
  27. package/{skills → rules}/doc-files/js/docs/docgen-extract.md +2 -2
  28. package/{skills → rules}/doc-files/js/docs/docgen-files-batch.md +2 -2
  29. package/{skills → rules}/doc-files/js/docs/docgen-gen.md +2 -2
  30. package/{skills → rules}/doc-files/js/docs/docgen-ignore.md +4 -4
  31. package/rules/doc-files/js/docs/docgen-prompts.md +39 -0
  32. package/rules/doc-files/js/docs/docgen-scan.md +54 -0
  33. package/rules/doc-files/js/docs/lint.md +36 -0
  34. package/rules/doc-files/js/docs/units-js.md +31 -0
  35. package/rules/doc-files/js/docs/units-rs.md +35 -0
  36. package/rules/doc-files/js/docs/units.md +30 -0
  37. package/rules/doc-files/js/lint.mjs +96 -0
  38. package/{skills → rules}/doc-files/js/units-rs.mjs +37 -17
  39. package/rules/doc-files/lint/docs/lint.md +37 -0
  40. package/rules/doc-files/lint/lint.mjs +105 -0
  41. package/rules/doc-files/meta.json +1 -0
  42. package/rules/docker/docs/fix.md +21 -161
  43. package/rules/efes/docs/fix.md +23 -194
  44. package/rules/feedback/docs/fix.md +10 -8
  45. package/rules/ga/docs/fix.md +10 -5
  46. package/rules/ga/meta.json +1 -1
  47. package/rules/graphql/docs/fix.md +23 -119
  48. package/rules/hasura/docs/fix.md +19 -5
  49. package/rules/hasura/js/docs/internal_urls.md +34 -307
  50. package/rules/image-avif/docs/fix.md +16 -127
  51. package/rules/image-compress/docs/fix.md +20 -141
  52. package/rules/image-compress/js/docs/package_setup.md +22 -182
  53. package/rules/js-bun-db/docs/fix.md +23 -139
  54. package/rules/js-bun-db/js/docs/safety.md +33 -221
  55. package/rules/js-bun-redis/docs/fix.md +25 -114
  56. package/rules/js-bun-redis/js/docs/imports.md +18 -166
  57. package/rules/js-lint/docs/fix.md +30 -108
  58. package/rules/js-lint/js/docs/lint-findings.md +37 -17
  59. package/rules/js-lint/js/docs/lint.md +22 -238
  60. package/rules/js-lint/js/docs/tooling.md +34 -331
  61. package/rules/js-lint/js/lint.mjs +19 -12
  62. package/rules/js-lint/js-lint.mdc +1 -1
  63. package/rules/js-lint/meta.json +1 -1
  64. package/rules/js-lint-ci/docs/fix.md +16 -149
  65. package/rules/js-lint-ci/js/docs/lint.md +16 -136
  66. package/rules/js-lint-ci/js-lint-ci.mdc +1 -1
  67. package/rules/js-lint-ci/meta.json +1 -1
  68. package/rules/js-mssql/docs/fix.md +18 -123
  69. package/rules/js-mssql/js/docs/deps.md +28 -251
  70. package/rules/js-run/docs/fix.md +23 -138
  71. package/rules/js-run/js/docs/runtime.md +24 -378
  72. package/rules/k8s/docs/fix.md +18 -123
  73. package/rules/nginx-default-tpl/docs/fix.md +22 -118
  74. package/rules/nginx-default-tpl/js/docs/template.md +38 -360
  75. package/rules/npm-module/docs/fix.md +27 -89
  76. package/rules/npm-module/js/docs/header_doc_pointer.md +15 -15
  77. package/rules/npm-module/js/docs/package_structure.md +36 -258
  78. package/rules/npm-module/js/docs/rule_meta.md +25 -127
  79. package/rules/npm-module/js/docs/skill_meta.md +18 -180
  80. package/rules/npm-module/js/rule_meta.mjs +3 -3
  81. package/rules/php/docs/fix.md +21 -98
  82. package/rules/php/js/docs/tooling.md +20 -143
  83. package/rules/python/docs/fix.md +25 -157
  84. package/rules/python/js/docs/applies.md +20 -98
  85. package/rules/python/js/docs/tooling.md +27 -144
  86. package/rules/rego/docs/fix.md +24 -112
  87. package/rules/rego/js/docs/applies.md +20 -164
  88. package/rules/rego/js/docs/lint.md +15 -110
  89. package/rules/rego/meta.json +1 -1
  90. package/rules/release/docs/fix.md +16 -114
  91. package/rules/rust/docs/fix.md +24 -119
  92. package/rules/rust/js/docs/applies.md +20 -129
  93. package/rules/security/docs/fix.md +21 -78
  94. package/rules/security/js/docs/sample_secret.md +23 -182
  95. package/rules/security/js/docs/trufflehog.md +19 -128
  96. package/rules/security/meta.json +1 -1
  97. package/rules/style-lint/docs/fix.md +16 -150
  98. package/rules/style-lint/js/docs/lint.md +21 -172
  99. package/rules/style-lint/js/docs/tooling.md +19 -184
  100. package/rules/style-lint/js/lint.mjs +4 -3
  101. package/rules/style-lint/meta.json +1 -1
  102. package/rules/tauri/docs/fix.md +26 -152
  103. package/rules/tauri/js/docs/cargo_mutants_config.md +21 -159
  104. package/rules/tauri/js/docs/tooling.md +20 -217
  105. package/rules/test/docs/fix.md +19 -127
  106. package/rules/test/js/data/stryker_config/docs/stryker.config.baseline.md +15 -127
  107. package/rules/test/js/data/stryker_config/docs/stryker.config.vue.baseline.md +17 -153
  108. package/rules/test/js/docs/cargo_mutants_config.md +24 -164
  109. package/rules/test/js/docs/location.md +24 -126
  110. package/rules/test/js/docs/no-process-chdir.md +20 -151
  111. package/rules/test/js/docs/no-relative-fs-path.md +24 -261
  112. package/rules/test/js/docs/stryker_config.md +48 -148
  113. package/rules/test/js/docs/vitest-config-pool-forks.md +21 -164
  114. package/rules/text/docs/fix.md +25 -113
  115. package/rules/text/js/docs/forbidden-prettier.md +21 -132
  116. package/rules/text/js/docs/formatting.md +60 -251
  117. package/rules/text/js/docs/lint.md +17 -114
  118. package/rules/text/js/lint.mjs +5 -3
  119. package/rules/text/lint/docs/lint.md +1 -1
  120. package/rules/text/lint/docs/run-dotenv-linter.md +1 -1
  121. package/rules/text/lint/docs/run-shellcheck.md +1 -1
  122. package/rules/text/lint/lint.mjs +13 -9
  123. package/rules/text/lint/run-dotenv-linter.mjs +13 -10
  124. package/rules/text/lint/run-shellcheck.mjs +10 -6
  125. package/rules/text/meta.json +1 -1
  126. package/rules/vue/docs/fix.md +25 -118
  127. package/rules/vue/js/docs/packages.md +25 -323
  128. package/rules/worktree/docs/fix.md +31 -150
  129. package/scripts/coverage-classify/docs/index.md +23 -209
  130. package/scripts/coverage-classify/docs/verdict-schema.md +14 -159
  131. package/scripts/dispatcher/docs/trace.md +35 -0
  132. package/scripts/docs/auto-rules.md +37 -361
  133. package/scripts/docs/lint-cli.md +12 -13
  134. package/scripts/docs/post-tool-use-fix.md +16 -15
  135. package/scripts/docs/skills-cli.md +26 -23
  136. package/scripts/docs/sync-claude-config.md +94 -34
  137. package/scripts/docs/worktree-cli.md +11 -34
  138. package/scripts/lib/docs/assert-project-root.md +14 -16
  139. package/scripts/lib/docs/changed-files.md +24 -139
  140. package/scripts/lib/docs/discover-check-rules-from-cursor.md +14 -146
  141. package/scripts/lib/docs/rule-meta.md +1 -1
  142. package/scripts/lib/docs/rule-predicates.md +20 -17
  143. package/scripts/lib/docs/run-rule-cli.md +14 -18
  144. package/scripts/lib/docs/run-rule.md +13 -20
  145. package/scripts/lib/docs/run-standard-rule.md +12 -15
  146. package/scripts/lib/docs/sync-gitignore-worktree.md +15 -18
  147. package/scripts/lib/rule-meta.mjs +10 -6
  148. package/scripts/lib/rule-predicates.mjs +1 -1
  149. package/scripts/lint-cli.mjs +28 -20
  150. package/scripts/sync-claude-config.mjs +4 -1
  151. package/scripts/utils/docs/with-lock.md +19 -12
  152. package/scripts/utils/with-lock.mjs +4 -2
  153. package/skills/doc-aggregate/SKILL.md +2 -2
  154. package/skills/doc-aggregate/js/docgen-ignore.mjs +6 -6
  155. package/skills/doc-aggregate/js/docs/docgen-ignore.md +1 -1
  156. package/skills/doc-aggregate/js/docs/docgen-scan.md +78 -0
  157. package/skills/doc-files/.changes/260612-0031.md +5 -0
  158. package/skills/doc-files/.changes/260612-0036.md +5 -0
  159. package/skills/doc-files/.changes/260612-0114.md +5 -0
  160. package/skills/doc-files/SKILL.md +6 -6
  161. package/skills/fix/js/docs/llm-worker.md +17 -15
  162. package/skills/fix/js/docs/orchestrator.md +30 -23
  163. package/skills/fix/js/docs/t0.md +26 -16
  164. package/skills/start-check/js/docs/check.md +26 -22
  165. package/skills/taze/js/docs/diff.md +44 -20
  166. package/skills/doc-files/js/docs/docgen-prompts.md +0 -32
  167. package/skills/doc-files/js/docs/docgen-scan.md +0 -25
  168. package/skills/doc-files/js/docs/units-rs.md +0 -35
  169. /package/{skills → rules}/doc-files/js/docgen-crc.mjs +0 -0
  170. /package/{skills → rules}/doc-files/js/docgen-extract-anchors.mjs +0 -0
  171. /package/{skills → rules}/doc-files/js/docgen-prompts.mjs +0 -0
  172. /package/{skills → rules}/doc-files/js/units-js.mjs +0 -0
  173. /package/{skills → rules}/doc-files/js/units.mjs +0 -0
@@ -26,7 +26,7 @@
26
26
  "hooks": [
27
27
  {
28
28
  "type": "command",
29
- "command": "npx --no @nitra/cursor doc-files check --hook",
29
+ "command": "npx --no @nitra/cursor lint-doc-files --hook",
30
30
  "timeout": 120
31
31
  }
32
32
  ]
@@ -38,7 +38,7 @@
38
38
  "hooks": [
39
39
  {
40
40
  "type": "command",
41
- "command": "npx --no @nitra/cursor doc-files check --git",
41
+ "command": "npx --no @nitra/cursor lint-doc-files --git",
42
42
  "timeout": 120
43
43
  }
44
44
  ]
@@ -2,39 +2,28 @@
2
2
  docgen:
3
3
  source: npm/.pi-template/extensions/n-cursor-adr/index.ts
4
4
  crc: 3233716f
5
+ score: 100
5
6
  ---
6
7
 
7
8
  # index.ts
8
9
 
9
10
  ## Огляд
10
11
 
11
- Огляд
12
-
13
- Файл слугує механізмом для підготовки даних сесії та ініціації виконання зовнішніх рішень. Він серіалізує поточний стан сесії для формування вхідного JSON і запускає відповідні скрипти для прийняття рішень.
12
+ Файл збирає записи сесії, серіалізує їх у формат JSONL, записує у тимчасову директорію, а потім ініціює виконання скриптів хуків capture та normalize.
14
13
 
15
14
  ## Поведінка
16
15
 
17
- 1. Запуск відбувається при події agent_end.
18
- 2. Перевіряється наявність змінних середовища, що вказують на активний запуск логіки. Якщо перевірка позитивна, виконання зупиняється.
19
- 3. Зчитуються записи сесії з `sessionManager`.
20
- 4. Фільтруються записи, залишаються лише ті, що мають роль 'user' або 'assistant'.
21
- 5. Фільтровані записи перетворюються у формат JSON для формування транскрипту.
22
- 6. Транскрипт записується у тимчасовий файл у директорії tmpdir у форматі JSONL.
23
- 7. Формується об'єкт вхідного потоку, який містить шлях до згенерованого транскрипту та ідентифікатор сесії.
24
- 8. Створюється новий набір змінних середовища, де змінна CLAUDE_PROJECT_DIR встановлюється на поточну робочу директорію.
25
- 9. Паралельно виконуються два окремі скрипти bash: capture-decisions.sh та normalize-decisions.sh.
26
- 10. Обидва скрипти отримують вхідний JSON-пакет і виконуються через адаптер pi.exec.
27
- 11. Виконування здійснюється асинхронно. Якщо скрипти відсутні, це може призвести до помилки, яка буде зареєстрована у результаті виконання.
28
- 12. Помилки виконання ловляться, щоб забезпечити стабільність системи.
16
+ 1. Виклик події agent_end.
17
+ 2. Перевірка захисту від рекурсії через змінні середовища. Якщо встановлено змінні, виконання зупиняється.
18
+ 3. Серіалізація записів сесії. Зчитування записів з sessionManager та формування рядка JSONL.
19
+ 4. Запис JSONL файлу. Запис серіалізованого тексту у тимчасову директорію.
20
+ 5. Формування вхідного навантаження. Створення JSON об'єкта для передачі у башку.
21
+ 6. Передача виконання скриптів. Паралельний запуск двох окремих скриптів.
22
+ а. Виконання хука capture.
23
+ б. Виконання хука normalize.
24
+ 7. Обробка результатів. Очікування завершення обох виконання. Помилки обробляються у загальному режимі.
29
25
 
30
26
  ## Гарантії поведінки
31
27
 
32
- - Доступ до файлу дозволений
33
- - Операція запису та модифікації даних дозволена
34
- - При виникненні помилок система перехоплює їх
35
- - Система не генерує винятків назовні
36
- - Система не використовує кешування
37
- - Система не виконує операцій з мережею
38
- - Логіка пропуску та обмеження швидкості залишається у бах (bash)
39
- - Логіка вибору LLM-CLI залишається у бах (bash)
40
- - Перевірка рекурсії здійснюється через змінні середовища встановлені бах перед запуском LLM CLI
28
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
29
+ - Не звертається до мережі.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## [6.0.0] - 2026-06-14
4
+
5
+ ### Added
6
+
7
+ - fix-doc-files: пер-файловий таймінг у виводі — `<total>s (llm <llmS>/<N> calls, orch <orchS>)`: видно, скільки часу зайняла модель (і кількість LLM-викликів) проти JS-оркестрації. `generateDoc` повертає `llmMs`/`llmCalls`; облік через прозору обгортку `callLlm` (синхронні spawnSync-виклики, послідовна генерація — без гонок).
8
+
9
+ ### Changed
10
+
11
+ - lint: вісь scope per-file|full (база-origin) + вісь behavior fix-by-default/--read-only; meta.json:lint hard-rename quick|ci→per-file|full; lint-ci=--read-only --full; контракт lint(files,cwd,{readOnly})
12
+
13
+ ## [5.4.0] - 2026-06-14
14
+
15
+ ### Added
16
+
17
+ - doc-files: міграція скіл→правило `npm/rules/doc-files/` (git mv `js/`); нові команди `lint-doc-files` (детермінований детектор stale `missing`∪`crc-mismatch`, exit 1; режими `--json`/`--missing-only`/`--hook`/`--git`/`--degraded`) і `fix-doc-files` (local-only генерація + `--stamp`); `lint`-адаптер агрегатора (`lint:"quick"`); `doc-files <sub>` стає делегувальним deprecated-аліасом (plain `check` exit 2→1; `--hook`/`--git` лишають exit 2); hook-маркер `@nitra/cursor lint-doc-files` із cleanup legacy `doc-files check`; тонкий скіл doc-files.
18
+
19
+ ### Fixed
20
+
21
+ - lint-js: 12 oxlint-помилок — RS\_\*-регекспи догори module scope і прибрані невикористані (docgen-extract, docgen-protected.test), повернуто JSDoc extractReasoning на місце (omlx), async без await (rule-predicates), сигнальний re-raise замість process.exit у with-lock (коректні коди 130/143), опис @returns (units-rs)
22
+ - doc-files check <paths>: перший позиційний шлях мовчки губився без --max (порівняння зі значенням argv[maxIdx+1] при maxIdx=-1); значення прапорців тепер виключаються за індексом (--max, --root) + регресійні тести
23
+
3
24
  ## [5.3.4] - 2026-06-11
4
25
 
5
26
  ### Changed
package/bin/n-cursor.js CHANGED
@@ -25,10 +25,9 @@
25
25
  * `npx \@nitra/cursor lint-docker` — канонічний lint-docker (docker.mdc): `hadolint` по `Dockerfile`/`*.Dockerfile`
26
26
  * `npx \@nitra/cursor lint-text` — канонічний lint-text (text.mdc): `cspell` → `shellcheck` (з auto-fix) →
27
27
  * `markdownlint-cli2 --fix` → `v8r` (json/json5/yaml/yml/toml)
28
- * `npx \@nitra/cursor doc-files scan` — JSON-лістинг кодових файлів зі станом застарілості (`stale`: `missing`|`crc-mismatch`) для обовʼязкового скілу doc-files (ignore-glob у `npm/skills/doc-files/js/docgen-ignore.mjs`; тека `docs/` поряд із джерелом)
29
- * `npx \@nitra/cursor doc-files check` детектор застарілості для hook'ів (`--hook` PostToolUse, `--git` Stop-гейт із порогом `--max`); exit 2 стале знайдено
30
- * `npx \@nitra/cursor doc-files gen` JS-оркестрована генерація файлових док (роутинг local/cloud) зі штампом CRC у frontmatter (`--limit`/`--from`/`--overwrite`)
31
- * `npx \@nitra/cursor doc-files stamp` — детерміновано (пере)штампувати CRC у наявних доках без LLM
28
+ * `npx \@nitra/cursor lint-doc-files` — детермінований детектор застарілості файлових док (`stale`: `missing`|`crc-mismatch`); правило doc-files (ignore-glob у `npm/rules/doc-files/js/docgen-ignore.mjs`; тека `docs/` поряд із джерелом). Режими: повний (exit 1), `--json` (exit 0), `--missing-only`, `--hook`/`--git` (hook-протокол, exit 2), `--degraded`
29
+ * `npx \@nitra/cursor fix-doc-files` JS-оркестрована генерація файлових док (роутинг local/cloud) зі штампом CRC (`--limit`/`--from`/`--overwrite`/`--retry-degraded`); `--stamp`детерміноване перештампування CRC без LLM
30
+ * `npx \@nitra/cursor doc-files <sub>` DEPRECATED-аліас (scan|check|gen|stamp) `lint-doc-files`/`fix-doc-files`
32
31
  * `npx \@nitra/cursor doc-aggregate modules` — JSON-лістинг логічних модулів (межі за `package.json`) для Tier 2 скілу doc-aggregate
33
32
  * `npx \@nitra/cursor skill list` — скіли пакета без синку в проєкт
34
33
  * `npx \@nitra/cursor skill taze` — промпт на stdout
@@ -1595,7 +1594,7 @@ async function runSync() {
1595
1594
  /**
1596
1595
  * Команди, що мутують проєкт у CWD і вимагають кореня репо. `undefined`/`''` —
1597
1596
  * дефолтний sync; `check` — deprecated-alias `fix`. Решта (read-only `trace`,
1598
- * `--root`-команди `doc-files`/`doc-aggregate`/`rename-yaml-extensions`, `worktree`,
1597
+ * `--root`-команди `lint-doc-files`/`fix-doc-files`/`doc-files`/`doc-aggregate`/`rename-yaml-extensions`, `worktree`,
1599
1598
  * sub-лінтери) гард не зачіпає.
1600
1599
  */
1601
1600
  const ROOT_GUARDED_COMMANDS = new Set([undefined, '', 'fix', 'check', 'lint', 'coverage', 'change', 'release'])
@@ -1641,7 +1640,7 @@ try {
1641
1640
  // .n-cursor.json + bun install, а fix/lint/coverage/change/release переписують файли в CWD —
1642
1641
  // усе це ключиться на cwd(). Запуск із піддиректорії git-репо (типово прямий
1643
1642
  // `bun npm/bin/n-cursor.js` не з кореня) зачепив би не той каталог → STOP. Read-only та
1644
- // `--root`-команди (trace, graph, doc-files, doc-aggregate, rename-yaml-extensions) не зачіпаємо.
1643
+ // `--root`-команди (trace, graph, lint-doc-files, fix-doc-files, doc-files, doc-aggregate, rename-yaml-extensions) не зачіпаємо.
1645
1644
  if (ROOT_GUARDED_COMMANDS.has(command)) {
1646
1645
  assertCwdIsProjectRoot(cwd(), describeRootGuardedAction(command))
1647
1646
  }
@@ -1687,12 +1686,14 @@ try {
1687
1686
  break
1688
1687
  }
1689
1688
  case 'lint': {
1690
- process.exitCode = await runLint({ ci: false })
1689
+ // Дві ортогональні осі: --full (scope: весь репо vs дельта vs origin) × --read-only (behavior).
1690
+ process.exitCode = await runLint({ full: args.includes('--full'), readOnly: args.includes('--read-only') })
1691
1691
 
1692
1692
  break
1693
1693
  }
1694
1694
  case 'lint-ci': {
1695
- process.exitCode = await runLint({ ci: true })
1695
+ // CI = весь репо в read-only (нуль мутацій, нуль LLM) — еквівалент `lint --read-only --full`.
1696
+ process.exitCode = await runLint({ full: true, readOnly: true })
1696
1697
 
1697
1698
  break
1698
1699
  }
@@ -1810,36 +1811,58 @@ try {
1810
1811
 
1811
1812
  break
1812
1813
  }
1814
+ case 'lint-doc-files': {
1815
+ // n-cursor lint-doc-files — детермінований детектор застарілості файлових док
1816
+ // (missing ∪ crc-mismatch). Режими: (повний) exit 1, --json exit 0, --missing-only,
1817
+ // --hook/--git/--degraded — hook-протокол (exit 2/0). Деталі — doc-files.mdc.
1818
+ const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
1819
+ process.exitCode = await runLintDocFilesCli(args)
1820
+
1821
+ break
1822
+ }
1823
+ case 'fix-doc-files': {
1824
+ // n-cursor fix-doc-files — local-only генерація файлових док (omlx) + CRC-штамп
1825
+ // (--limit/--from/--overwrite/--retry-degraded); --stamp — детерміноване
1826
+ // перештампування source+crc без LLM. У CI не запускається (потрібна локальна модель).
1827
+ if (args.includes('--stamp')) {
1828
+ const { runDocFilesStampCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
1829
+ process.exitCode = runDocFilesStampCli(args.filter(a => a !== '--stamp'))
1830
+ } else {
1831
+ const { runDocFilesGenCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
1832
+ process.exitCode = await runDocFilesGenCli(args)
1833
+ }
1834
+
1835
+ break
1836
+ }
1813
1837
  case 'doc-files': {
1814
- // n-cursor doc-files scan|check|gen|stamp — обовʼязковий крок задачі (як lint):
1815
- // файлова дока поряд із джерелом, застарілість за CRC у frontmatter.
1816
- // scan — JSON-лістинг кодових файлів зі станом stale (missing|crc-mismatch);
1817
- // check детектор застарілості для hook'ів (--hook PostToolUse, --git Stop-гейт);
1818
- // gen — JS-оркестрована генерація доки (роутинг local/cloud) + CRC-штамп;
1819
- // stamp — детерміновано (пере)штампувати CRC у наявних доках без LLM.
1838
+ // Делегувальний аліас (deprecated): doc-files scan|check|gen|stamp
1839
+ // lint-doc-files / fix-doc-files. Зняття наступний major (спека 2026-06-12).
1840
+ // Зміна exit: plain `check` 2→1 (через lint-doc-files); --hook/--git зберігають 2.
1841
+ console.error('⚠ `doc-files <sub>` застаріло використовуй `lint-doc-files` / `fix-doc-files`.')
1842
+ const rest = args.slice(1)
1820
1843
  switch (args[0]) {
1821
1844
  case 'scan': {
1822
- const { runDocFilesScanCli } = await import('../skills/doc-files/js/docgen-scan.mjs')
1823
- process.exitCode = runDocFilesScanCli(args.slice(1))
1845
+ const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
1846
+ process.exitCode = await runLintDocFilesCli(['--json', ...rest])
1824
1847
  break
1825
1848
  }
1826
1849
  case 'check': {
1827
- const { runDocFilesCheckCli } = await import('../skills/doc-files/js/docgen-scan.mjs')
1828
- process.exitCode = await runDocFilesCheckCli(args.slice(1))
1850
+ const { runLintDocFilesCli } = await import('../rules/doc-files/lint/lint.mjs')
1851
+ process.exitCode = await runLintDocFilesCli(rest)
1829
1852
  break
1830
1853
  }
1831
1854
  case 'gen': {
1832
- const { runDocFilesGenCli } = await import('../skills/doc-files/js/docgen-files-batch.mjs')
1833
- process.exitCode = await runDocFilesGenCli(args.slice(1))
1855
+ const { runDocFilesGenCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
1856
+ process.exitCode = await runDocFilesGenCli(rest)
1834
1857
  break
1835
1858
  }
1836
1859
  case 'stamp': {
1837
- const { runDocFilesStampCli } = await import('../skills/doc-files/js/docgen-files-batch.mjs')
1838
- process.exitCode = runDocFilesStampCli(args.slice(1))
1860
+ const { runDocFilesStampCli } = await import('../rules/doc-files/js/docgen-files-batch.mjs')
1861
+ process.exitCode = runDocFilesStampCli(rest)
1839
1862
  break
1840
1863
  }
1841
1864
  default: {
1842
- console.error('Usage: npx @nitra/cursor doc-files <scan|check|gen|stamp> [--root <dir>]')
1865
+ console.error('Usage: npx @nitra/cursor lint-doc-files | fix-doc-files [--root <dir>]')
1843
1866
  process.exitCode = 1
1844
1867
  }
1845
1868
  }
@@ -1869,7 +1892,7 @@ try {
1869
1892
  default: {
1870
1893
  console.error(`❌ Невідома команда: ${command}`)
1871
1894
  console.error(
1872
- ` Очікується: (без аргументів) синхронізація правил, fix, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, coverage, coverage-fix, taze, start-check, fix-t0, change, release, skill, worktree, lint-ci, trace, doc-files, doc-aggregate`
1895
+ ` Очікується: (без аргументів) синхронізація правил, fix, check, rename-yaml-extensions, post-tool-use-fix, lint, lint-ga, lint-rego, lint-k8s, lint-docker, lint-text, lint-doc-files, fix-doc-files, coverage, coverage-fix, taze, start-check, fix-t0, change, release, skill, worktree, lint-ci, trace, doc-files, doc-aggregate`
1873
1896
  )
1874
1897
  process.exitCode = 1
1875
1898
  }
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/lib/models.mjs
4
- crc: feb82992
4
+ crc: 181e2bf9
5
5
  score: 100
6
6
  ---
7
7
 
@@ -9,29 +9,40 @@ docgen:
9
9
 
10
10
  ## Огляд
11
11
 
12
- Файл визначає глобальну класифікацію моделей для системи pi, встановлюючи конфігураційні моделі для локального та хмарного інференсу через змінні середовища (наприклад, `N_LOCAL_MIN_MODEL`). Значення моделі мають формат "provider/model-id".
13
-
14
- Система надає механізм каскадного вибору моделі через функцію `resolveModel`. Цей механізм послідовно перевіряє локальні тири (`LOCAL_MIN` $\rightarrow$ `LOCAL_AVG` $\rightarrow$ `LOCAL_MAX`), а потім хмарні тири, якщо попередні не визначені. Це забезпечує прозору роботу, навіть якщо локальні моделі відсутні. Прямі константи (наприклад, `LOCAL_MIN`) залишені для випадків, що вимагають явного контролю над вибором моделі.
12
+ Файл визначає глобальну класифікацію моделей для pi. Конфігурація встановлюється через змінні середовища (наприклад, `N_LOCAL_MIN_MODEL`) та використовується для визначення, який провайдер буде викликаний. Кожен скіл посилається на потрібний тир, який використовується для вибору моделі.
15
13
 
16
14
  ## Поведінка
17
15
 
18
- LOCAL_MIN повертає модель для швидкого локального інференсу, або порожній рядок, якщо змінна середовища не встановлена.
19
- LOCAL_AVG повертає модель для середнього локального інференсу, або порожній рядок, якщо змінна середовища не встановлена.
20
- LOCAL_MAX повертає модель для максимального локального інференсу, або порожній рядок, якщо змінна середовища не встановлена.
21
- CLOUD_MIN повертає модель для мінімального хмарного інференсу, або порожній рядок, якщо змінна середовища не встановлена.
22
- CLOUD_AVG повертає модель для середнього хмарного інференсу, або порожній рядок, якщо змінна середовища не встановлена.
23
- CLOUD_MAX повертає модель для максимального хмарного інференсу, або порожній рядок, якщо змінна середовища не встановлена.
24
- resolveModel повертає перший непорожній model-id для запитаного тиру, каскадно перевіряючи локальні тири, а потім хмарний еквівалент, або порожній рядок, якщо жоден тир не задано.
16
+ LOCAL_MIN
17
+ Завантажує модель для мінімального локального виведення
18
+
19
+ LOCAL_AVG
20
+ Завантажує модель для середнього локального виведення
21
+
22
+ LOCAL_MAX
23
+ Завантажує модель для максимального локального виведення
24
+
25
+ CLOUD_MIN
26
+ Завантажує модель для мінімального хмарного виведення
27
+
28
+ CLOUD_AVG
29
+ Завантажує модель для середнього хмарного виведення
30
+
31
+ CLOUD_MAX
32
+ Завантажує модель для максимального хмарного виведення
33
+
34
+ resolveModel
35
+ Повертає перший непорожній model-id для запитаного тиру, каскадно перевіряючи локальні тири, а тоді хмарний еквівалент
25
36
 
26
37
  ## Публічний API
27
38
 
28
- LOCAL_MIN — Швидке виконання моделі на локальному пристрої.
29
- LOCAL_AVG — Середнє за продуктивністю виконання моделі на локальному пристрої.
30
- LOCAL_MAX — Найпотужніше виконання моделі на локальному пристрої.
31
- CLOUD_MIN — Найменш ресурсомістке виконання моделі в хмарі.
32
- CLOUD_AVG — Середній рівень продуктивності виконання моделі в хмарі.
33
- CLOUD_MAX — Найпотужніше виконання моделі в хмарі.
34
- resolveModel — Знаходить і повертає ідентифікатор моделі, починаючи з локальних варіантів, а потім переходячи до хмарних відповідників.
39
+ LOCAL_MIN — Швидкий локальний inference. Напр.: ollama/gemma3:4b
40
+ LOCAL_AVG — Середній локальний. Напр.: ollama/gemma4:26b-moe
41
+ LOCAL_MAX — Максимальний локальний. Напр.: ollama/llama4-maverick
42
+ CLOUD_MIN — Мінімальний хмарний. Напр.: openai/gpt-5.4-mini, google/gemini-2.5-flash, anthropic/claude-haiku-4-5
43
+ CLOUD_AVG — Середній хмарний. Напр.: openai/gpt-5.4, google/gemini-2.5-pro, anthropic/claude-sonnet-4-6
44
+ CLOUD_MAX — Максимальний хмарний. Напр.: openai/gpt-5.5, anthropic/claude-opus-4-8
45
+ resolveModel — Знаходить перший непорожній model-id для запиту, починаючи з локальних, а потім переходить до хмарних варіантів.
35
46
 
36
47
  ## Гарантії поведінки
37
48
 
@@ -0,0 +1,51 @@
1
+ ---
2
+ docgen:
3
+ source: npm/lib/omlx-trace.mjs
4
+ crc: 3ff568d5
5
+ score: 100
6
+ ---
7
+
8
+ # omlx-trace.mjs
9
+
10
+ ## Огляд
11
+
12
+ Модуль збирає трасу викликів LLM, фіксуючи думки моделі та спостережуваний слід. Траса записується у локальний файл для ротації та готується для подальшої батч-агрегації. Дизайн-специфікація: docs/specs/2026-06-10-omlx-wire-trace-capture-design.md.
13
+
14
+ ## Поведінка
15
+
16
+ MAX_MSG_CHARS
17
+ Ліміт символів на одне message.content у записі
18
+
19
+ ROTATE_BYTES
20
+ Поріг недеструктивної ротації активного файлу в байтах
21
+
22
+ tracePath
23
+ Повертає шлях до trace-файлу або null
24
+
25
+ capMessages
26
+ Обрізає message.content та рахує sha256 повного масиву
27
+
28
+ buildTraceRecord
29
+ Будує нормалізований trace-запис
30
+
31
+ rotateIfNeeded
32
+ Недеструктивно ротує файл при перевищенні ROTATE_BYTES
33
+
34
+ writeTrace
35
+ Записує trace-запис у файл з ротацією та fail-safe
36
+
37
+ ## Публічний API
38
+
39
+ MAX_MSG_CHARS — встановлює максимальну кількість символів для вмісту повідомлення.
40
+ ROTATE_BYTES — визначає поріг для ініціювання ротації файлу.
41
+ tracePath — зберігає шлях до файлу трасування або порожній рядок, якщо трасування вимкнено.
42
+ N_CURSOR_LLM_TRACE — визначає пріоритет для вибору шляху трасування: спочатку перевіряється вимкнений перемикач, потім використовується явний шлях.
43
+ buildTraceRecord — створює запис трасування, залишаючи порожні значення для полів, які недоступні.
44
+ rotateIfNeeded — перейменовує файл при перевищенні ліміту, створюючи новий файл з послідовним індексом.
45
+ writeTrace — записує один запис трасування, обробляючи шляхи, ротуючи дані за необхідності та обробляючи помилки вводу/виводу.
46
+
47
+ ## Гарантії поведінки
48
+
49
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
50
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
51
+ - Не звертається до мережі.
package/lib/docs/omlx.md CHANGED
@@ -1,32 +1,48 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/lib/omlx.mjs
4
- crc: e29efc97
4
+ crc: 0073bdfd
5
+ score: 90
5
6
  ---
6
7
 
7
- # omlx
8
+ # omlx.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Спільний транспорт до локального omlx-сервера (OpenAI-сумісний MLX-inference на `http://127.0.0.1:8000/v1/chat/completions`). Text-only: сервер не підтримує інструменти, тож модуль шле лише повідомлення й читає текст відповіді.
12
+ Файл забезпечує комунікацію з локальним omlx-сервером для отримання відповідей. Він маршрутизує запити, використовуючи конвенцію префікса для визначення, чи слід використовувати прямий HTTP виклик до omlx, чи CLI. Функції надають інструменти для роботи з API ключами та викликів до inference-сервера.
12
13
 
13
14
  ## Поведінка
14
15
 
15
- 1. Виклик будує запит з повідомленнями, моделлю, температурою і лімітом виходу; model-id з префіксом `omlx/` нормалізується до чистого імені, порожній — замінюється дефолтною моделлю (`mlx-community--gemma-4-e2b-it-4bit`, override через `N_CURSOR_OMLX_MODEL`).
16
- 2. Endpoint береться з `N_CURSOR_OMLX_URL` або дефолтний.
17
- 3. Якщо на сервері ввімкнено API-ключ, він резолвиться в порядку: явний параметр виклику → `N_CURSOR_OMLX_KEY` → поле `auth.api_key` з локального `~/.omlx/settings.json` (читання fail-safe) — і шлеться як `Authorization: Bearer`. Без знайденого ключа заголовок не додається.
18
- 4. Тимчасові обриви з'єднання (передача перервана, порожня відповідь, збій прийому) ретраяться до трьох спроб; решта помилок — виняток одразу.
19
- 5. Помилка API у тілі відповіді, невалідний JSON чи порожній контент — виняток із діагностичним префіксом `omlx …`.
16
+ DEFAULT_OMLX_URL: Дефолтний endpoint omlx
17
+
18
+ resolveOmlxApiKey: Резолвить API ключ для omlx-сервера
19
+
20
+ DEFAULT_OMLX_MODEL: Дефолтна модель для omlx
21
+
22
+ isOmlxModel: Перевіряє, чи model-id адресує локальний omlx-бекенд
23
+
24
+ omlxModelId: Прибирає префікс omlx/ з model-id
25
+
26
+ extractReasoning: Витягує reasoning з message
27
+
28
+ callOmlxRaw: Ядро прямого HTTP-виклику до omlx через curl
29
+
30
+ callOmlx: Тонка обгортка для отримання тексту відповіді
20
31
 
21
32
  ## Публічний API
22
33
 
23
- - `callOmlx` синхронний chat-виклик, повертає непорожній текст відповіді.
24
- - `isOmlxModel` / `omlxModelId` перевірка і зняття префікса `omlx/`.
25
- - `resolveOmlxApiKey` резолвінг API-ключа за описаним порядком джерел.
26
- - `DEFAULT_OMLX_URL` / `DEFAULT_OMLX_MODEL` дефолти endpoint і моделі.
34
+ DEFAULT_OMLX_URLдефолтний endpoint omlx (перевизначається як `N_CURSOR_OMLX_URL`).
35
+ resolveOmlxApiKey — отримує API-ключ для omlx-сервера, коли ввімкнено автентифікацію (`auth.skip_api_key_verification: false`). Порядок: явний `apiKey` env `N_CURSOR_OMLX_KEY` `auth.api_key` з `~/.omlx/settings.json` (для локальної машини, з читанням як за замовчуванням; читання як за замовчуванням; безпечне читання) → `null` (відсутність заголовка).
36
+ DEFAULT_OMLX_MODELдефолтна модель, якщо в ідентифікаторі залишився префікс `omlx/` (перевизначається як `N_CURSOR_OMLX_MODEL`).
37
+ isOmlxModel перевіряє, чи адресує цей model-id локальний omlx-бекенед (наявність префікса `omlx/`).
38
+ omlxModelId — видаляє префікс `omlx/` — отримує чистий model-id для omlx API. Не-omlx-рядки повертаються без змін.
39
+ extractReasoning — витягує обґрунтування з відповіді.
40
+ callOmlxRaw — виконує прямий HTTP-виклик до omlx через `curl` (за допомогою `spawnSync`). Повертає збагачений об'єкт: контент, обґрунтування, використання, результат завершення та кількість спроб. Перезапускає лише тимчасові помилки curl (18 = закритий трансфер, 52 = порожня відповідь, 56 = збій при отриманні).
41
+ callOmlx — тонко інкапсулює `callOmlxRaw` для споживачів, яким потрібен лише текст. Контракт: повертає вміст з `choices[0].message.content`. Без використання заголовків чи загальних фраз.
27
42
 
28
43
  ## Гарантії поведінки
29
44
 
30
- - Жодних `tools`/`tool_calls` у запиті сумісність із text-only сервером.
31
- - Ролі повідомлень (`system`/`user`) передаються без злиття.
32
- - Виняток ніколи не ковтається: викликач завжди дізнається про збій.
45
+ - Read-only: файл не виконує операцій запису у файлову систему.
46
+ - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
47
+ - За невдачі повертає значення помилки (`false`/`null`/`Err`) замість генерування винятку чи паніки.
48
+ - Не звертається до мережі.
package/lib/omlx.mjs CHANGED
@@ -69,6 +69,8 @@ export function omlxModelId(model) {
69
69
  return isOmlxModel(model) ? model.slice(OMLX_PREFIX.length) : model
70
70
  }
71
71
 
72
+ const THINK_TAG_RE = /<think>([\s\S]*?)<\/think>/
73
+
72
74
  /**
73
75
  * Витягує reasoning (думки моделі) з omlx-`message`. Джерела за пріоритетом:
74
76
  * - `field` — окреме поле `message.reasoning_content` (Qwen3-Thinking тощо);
@@ -80,11 +82,6 @@ export function omlxModelId(model) {
80
82
  * @param {string|null} finishReason `choices[0].finish_reason`
81
83
  * @returns {{ reasoning: string|null, reasoningSource: 'field'|'think_tag'|'truncated'|null }} текст думок і його джерело
82
84
  */
83
- const THINK_TAG_RE = /<think>([\s\S]*?)<\/think>/
84
-
85
- /**
86
- *
87
- */
88
85
  export function extractReasoning(message, finishReason) {
89
86
  const field = message?.reasoning_content
90
87
  if (field && field.trim()) return { reasoning: field, reasoningSource: 'field' }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/cursor",
3
- "version": "5.3.4",
3
+ "version": "6.0.0",
4
4
  "description": "CLI для завантаження cursor-правил (префікс n-) у локальний репозиторій",
5
5
  "keywords": [
6
6
  "cli",
@@ -1,30 +1,36 @@
1
1
  ---
2
2
  docgen:
3
3
  source: npm/rules/abie/fix.mjs
4
- crc: 12fc1644
4
+ crc: 38cf876b
5
+ score: 100
5
6
  ---
6
7
 
7
8
  # fix.mjs
8
9
 
9
10
  ## Огляд
10
11
 
11
- Файл виконує трансформацію вхідного запиту у структурований вивід формату Х. Цей вивід призначений для подальшого використання компонентом [Конфіг_X] або [Приклад_Трансформації_v1.2].
12
+ Запуск правила приймає контекст прогону, застосовує JS-занепокоєні та політику, генерує посилання MDC та повертає результат прогону.
12
13
 
13
- ## Поведінка
14
+ Виконання у режимі CLI виконує повний еквівалент команди `npx @nitra/cursor fix <id>` та повертає код виходу.
14
15
 
15
- 1. Запуск правила
16
- Викликається для виконання основного процесу перевірки.
16
+ ## Поведінка
17
17
 
18
- 2. Режим бібліотеки
19
- Функція повертає результат виконання основного правила.
18
+ 1. Запуск правила.
19
+ * Приймає контекст прогону.
20
+ * Виконує застосування JS-занепокоєних.
21
+ * Застосовує політику.
22
+ * Генерує посилання MDC.
23
+ * Повертає результат прогону.
20
24
 
21
- 3. Режим автономного запуску
22
- Якщо виконання відбувається через командний рядок, функція виконує повний цикл роботи, включаючи завантаження конфігурації, перевірку дозволених елементів та формування зведення. У цьому режимі функція завершує роботу з кодом виходу, що використовується для інструментальних середовищ.
25
+ 2. Виконання у режимі CLI.
26
+ * Виконується при запуску через CLI.
27
+ * Виконує повний еквівалент команди `npx @nitra/cursor fix <id>`.
28
+ * Повертає код виходу.
23
29
 
24
30
  ## Публічний API
25
31
 
26
- - run: Запускає правило, що переходить від applies до JS-concerns, policy та mdc-refs за допомогою runStandardRule.
27
- - Library mode: Ініціює роботу через CLI оркестрацію, використовуючи import та виклик run.
32
+ run запускає правило: applies JS-concerns policy mdc-refs (через runStandardRule).
33
+ Library mode викликається CLI orchestration через `import + run`.
28
34
 
29
35
  ## Гарантії поведінки
30
36