@nitra/cursor 3.27.0 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/package.json +1 -1
  3. package/rules/abie/js/applies.mjs +1 -5
  4. package/rules/abie/js/env_dns.mjs +1 -9
  5. package/rules/abie/js/firebase_hosting.mjs +1 -5
  6. package/rules/abie/js/hc_pairing.mjs +1 -8
  7. package/rules/abie/js/ua_http_route.mjs +1 -10
  8. package/rules/abie/js/ua_node_selector.mjs +1 -8
  9. package/rules/adr/js/hooks.mjs +1 -20
  10. package/rules/bun/js/layout.mjs +1 -19
  11. package/rules/capacitor/js/platforms.mjs +1 -23
  12. package/rules/changelog/js/consistency.mjs +1 -29
  13. package/rules/ci4/js/marksman_config.mjs +1 -19
  14. package/rules/docker/js/lint.mjs +1 -34
  15. package/rules/ga/docs/fix.md +4 -4
  16. package/rules/ga/js/docs/lint.md +3 -3
  17. package/rules/ga/js/docs/workflows.md +14 -14
  18. package/rules/ga/js/workflows.mjs +1 -16
  19. package/rules/ga/lint/docs/lint.md +9 -9
  20. package/rules/graphql/js/tooling.mjs +1 -9
  21. package/rules/hasura/js/internal_urls.mjs +1 -24
  22. package/rules/image-avif/js/avif_generation.mjs +1 -27
  23. package/rules/image-compress/js/package_setup.mjs +1 -18
  24. package/rules/js-bun-db/js/safety.mjs +1 -31
  25. package/rules/js-bun-redis/js/imports.mjs +1 -12
  26. package/rules/js-lint/js/docs/lint-findings.md +30 -0
  27. package/rules/js-lint/js/lint-findings.mjs +1 -7
  28. package/rules/js-lint/js/lint.mjs +1 -10
  29. package/rules/js-lint/js/tooling.mjs +1 -13
  30. package/rules/js-lint/js/utils_imports.mjs +1 -18
  31. package/rules/js-lint-ci/js/lint.mjs +1 -6
  32. package/rules/js-mssql/js/deps.mjs +1 -10
  33. package/rules/js-run/js/runtime.mjs +1 -37
  34. package/rules/js-run/lib/docs/temporal-scan.md +25 -0
  35. package/rules/k8s/js/manifests.mjs +1 -137
  36. package/rules/nginx-default-tpl/js/template.mjs +1 -18
  37. package/rules/npm-module/js/docs/header_doc_pointer.md +25 -0
  38. package/rules/npm-module/js/header_doc_pointer.mjs +82 -0
  39. package/rules/npm-module/js/package_structure.mjs +1 -28
  40. package/rules/npm-module/js/rule_meta.mjs +1 -10
  41. package/rules/npm-module/js/skill_meta.mjs +1 -13
  42. package/rules/php/js/tooling.mjs +1 -11
  43. package/rules/python/js/applies.mjs +1 -8
  44. package/rules/python/js/tooling.mjs +1 -21
  45. package/rules/rego/js/applies.mjs +1 -11
  46. package/rules/rust/js/applies.mjs +1 -7
  47. package/rules/security/js/sample_secret.mjs +1 -28
  48. package/rules/security/js/trufflehog.mjs +1 -8
  49. package/rules/style-lint/js/lint.mjs +1 -5
  50. package/rules/style-lint/js/tooling.mjs +1 -19
  51. package/rules/tauri/js/cargo_mutants_config.mjs +1 -20
  52. package/rules/tauri/js/tooling.mjs +1 -21
  53. package/rules/test/js/cargo_mutants_config.mjs +1 -12
  54. package/rules/test/js/location.mjs +1 -9
  55. package/rules/test/js/no-process-chdir.mjs +1 -21
  56. package/rules/test/js/no-relative-fs-path.mjs +1 -23
  57. package/rules/test/js/stryker_config.mjs +4 -25
  58. package/rules/test/js/vitest-config-pool-forks.mjs +1 -17
  59. package/rules/text/js/forbidden-prettier.mjs +1 -10
  60. package/rules/text/js/formatting.mjs +1 -31
  61. package/rules/vue/js/packages.mjs +1 -24
  62. package/scripts/docs/coverage-fix-extract.md +32 -0
  63. package/scripts/docs/lint-cli.md +25 -0
  64. package/scripts/docs/post-tool-use-fix.md +27 -0
  65. package/scripts/docs/rename-yaml-extensions.md +36 -0
  66. package/scripts/docs/skills-cli.md +35 -0
  67. package/scripts/docs/sync-claude-config.md +52 -0
  68. package/scripts/docs/sync-setup-bun-deps-action.md +26 -0
  69. package/scripts/docs/upgrade-nitra-cursor-and-install.md +29 -0
  70. package/scripts/docs/worktree-cli.md +46 -0
  71. package/scripts/lib/docs/assert-project-root.md +28 -0
  72. package/scripts/lib/docs/diff-added-lines.md +34 -0
  73. package/scripts/lib/docs/read-n-cursor-config-lite.md +28 -0
  74. package/scripts/lib/docs/resolve-target-files.md +34 -0
  75. package/scripts/lib/docs/root-notice.md +28 -0
  76. package/scripts/lib/docs/rule-meta-helpers.md +34 -0
  77. package/scripts/lib/docs/rule-meta.md +34 -0
  78. package/scripts/lib/docs/rule-predicates.md +30 -0
  79. package/scripts/lib/docs/run-conftest-batch.md +26 -0
  80. package/scripts/lib/docs/run-lint-step.md +25 -0
  81. package/scripts/lib/docs/run-rule-cli.md +27 -0
  82. package/scripts/lib/docs/run-rule.md +32 -0
  83. package/scripts/lib/docs/run-standard-lint.md +22 -0
  84. package/scripts/lib/docs/run-standard-rule.md +24 -0
  85. package/scripts/lib/docs/skill-meta.md +31 -0
  86. package/scripts/lib/docs/sync-gitignore-worktree.md +31 -0
  87. package/scripts/lib/docs/template.md +40 -0
  88. package/scripts/lib/docs/timing-summary.md +24 -0
  89. package/scripts/lib/docs/workspaces.md +30 -0
  90. package/scripts/lib/docs/worktree-notice.md +27 -0
  91. package/scripts/lib/docs/worktree.md +38 -0
  92. package/scripts/utils/docs/ast-scan-utils.md +50 -0
  93. package/scripts/utils/docs/ensure-gitignore-entries.md +28 -0
  94. package/scripts/utils/docs/find-package-json-paths.md +26 -0
  95. package/scripts/utils/docs/lock-cache-dir.md +25 -0
  96. package/scripts/utils/docs/pass.md +25 -0
  97. package/scripts/utils/docs/resolve-cargo-manifest.md +23 -0
  98. package/scripts/utils/docs/resolve-cmd.md +29 -0
  99. package/scripts/utils/docs/resolve-js-root.md +25 -0
  100. package/scripts/utils/docs/test-helpers.md +36 -0
  101. package/scripts/utils/docs/walk-cache.md +27 -0
  102. package/scripts/utils/docs/walkDir.md +32 -0
  103. package/scripts/utils/docs/with-lock.md +25 -0
  104. package/scripts/utils/docs/worktree-fingerprint.md +27 -0
  105. package/skills/docgen/js/docgen-batch.mjs +95 -0
  106. package/skills/docgen/js/docgen-extract.mjs +33 -18
  107. package/skills/docgen/js/docgen-gen.mjs +125 -98
  108. package/skills/docgen/js/docgen-ignore.mjs +1 -6
  109. package/skills/docgen/js/docgen-prompts.mjs +33 -22
  110. package/skills/docgen/js/docgen-scan.mjs +1 -8
  111. package/skills/docgen/js/docs/docgen-extract.md +28 -0
  112. package/skills/docgen/js/docs/docgen-gen.md +41 -0
  113. package/skills/docgen/js/docs/docgen-ignore.md +24 -0
  114. package/skills/docgen/js/docs/docgen-prompts.md +24 -0
  115. package/skills/docgen/js/docs/docgen-scan.md +48 -0
  116. package/skills/fix/js/docs/llm-worker.md +27 -0
  117. package/skills/fix/js/docs/orchestrator.md +32 -0
  118. package/skills/fix/js/docs/t0.md +29 -0
  119. package/skills/fix/js/llm-worker.mjs +64 -29
  120. package/skills/fix/js/orchestrator.mjs +45 -54
  121. package/skills/fix/js/t0.mjs +16 -32
  122. package/skills/start-check/js/check.mjs +1 -16
  123. package/skills/start-check/js/docs/check.md +34 -0
  124. package/skills/taze/js/diff.mjs +1 -15
  125. package/skills/taze/js/docs/diff.md +33 -0
@@ -1,18 +1,4 @@
1
- /**
2
- * T0-auto: детермінований рівень виправлень для n-fix оркестратора.
3
- *
4
- * Парсить `output` з `n-cursor fix --json` → застосовує програмний фікс без LLM.
5
- * Умова застосування: violation-message містить конкретне цільове значення
6
- * (назву файлу, рядок для вставки, ім'я залежності), яке можна видобути regex.
7
- *
8
- * Ієрархія: T0 (rm/create, знаний тип) → T0-auto (parse violation) → T1 (LLM).
9
- * T0-auto запускається першим у конвергентному циклі; T1 — лише для решти.
10
- *
11
- * Публічний API:
12
- * applyT0Auto(ruleId, violationOutput, cwd) → { applied: boolean, actions: string[] }
13
- * listT0AutoRules() → string[] (ids що мають хоч один паттерн)
14
- * runT0AutoCli(args, cwd) → Promise<number> (exit 0=clean, 1=violation)
15
- */
1
+ /** @see ./docs/t0.md */
16
2
  import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
17
3
  import { join } from 'node:path'
18
4
  import { spawnSync } from 'node:child_process'
@@ -57,7 +43,7 @@ const PATTERNS = [
57
43
  parsed.recommendations = [...recs, ...toAdd]
58
44
  writeFileSync(extPath, JSON.stringify(parsed, null, 2) + '\n', 'utf8')
59
45
  return { ok: true, action: `додано до extensions.json: ${toAdd.join(', ')}` }
60
- },
46
+ }
61
47
  },
62
48
 
63
49
  // ── rm-forbidden-file ────────────────────────────────────────────────────────
@@ -80,8 +66,8 @@ const PATTERNS = [
80
66
  }
81
67
  if (removed.length === 0) return { ok: false, action: 'файлів не знайдено' }
82
68
  return { ok: true, action: `видалено: ${removed.join(', ')}` }
83
- },
84
- },
69
+ }
70
+ }
85
71
  ]
86
72
 
87
73
  /**
@@ -116,9 +102,7 @@ export function applyT0Auto(ruleId, violationOutput, cwd) {
116
102
  * @returns {string[]}
117
103
  */
118
104
  export function filterT0AutoRules(failedRules) {
119
- return failedRules
120
- .filter(r => PATTERNS.some(p => p.test(r.output)))
121
- .map(r => r.ruleId)
105
+ return failedRules.filter(r => PATTERNS.some(p => p.test(r.output))).map(r => r.ruleId)
122
106
  }
123
107
 
124
108
  // ─── CLI entry-point ──────────────────────────────────────────────────────────
@@ -141,11 +125,11 @@ export async function runT0AutoCli(args, cwd) {
141
125
  const verbose = args.includes('--verbose') || args.includes('-v')
142
126
 
143
127
  // 1. Запустити fix --json
144
- const fixResult = spawnSync(
145
- 'bun',
146
- [N_CURSOR_BIN, '_fix-check', ...ruleFilter],
147
- { cwd, encoding: 'utf8', timeout: 120_000 }
148
- )
128
+ const fixResult = spawnSync('bun', [N_CURSOR_BIN, '_fix-check', ...ruleFilter], {
129
+ cwd,
130
+ encoding: 'utf8',
131
+ timeout: 120_000
132
+ })
149
133
  const raw = fixResult.stdout?.trim()
150
134
  if (!raw) {
151
135
  console.error(`n-cursor fix-t0: fix --json повернув порожній stdout`)
@@ -191,11 +175,11 @@ export async function runT0AutoCli(args, cwd) {
191
175
  }
192
176
 
193
177
  // 4. Check-gate: перевірити лише ті правила, що ми чіпали
194
- const recheck = spawnSync(
195
- 'bun',
196
- [N_CURSOR_BIN, '_fix-check', ...applied.map(a => a.ruleId)],
197
- { cwd, encoding: 'utf8', timeout: 120_000 }
198
- )
178
+ const recheck = spawnSync('bun', [N_CURSOR_BIN, '_fix-check', ...applied.map(a => a.ruleId)], {
179
+ cwd,
180
+ encoding: 'utf8',
181
+ timeout: 120_000
182
+ })
199
183
  const recheckRaw = recheck.stdout?.trim()
200
184
  if (!recheckRaw) {
201
185
  console.error(`fix-t0: check-gate: fix --json повернув порожній stdout`)
@@ -223,7 +207,7 @@ export async function runT0AutoCli(args, cwd) {
223
207
  const total = failed.length
224
208
  console.log(
225
209
  `✅ fix-t0: ${totalFixed}/${total} правил закрито T0-auto` +
226
- (skipped.length > 0 ? `; ${skipped.join(', ')} → T1 (LLM)` : '')
210
+ (skipped.length > 0 ? `; ${skipped.join(', ')} → T1 (LLM)` : '')
227
211
  )
228
212
  return 0
229
213
  }
@@ -1,19 +1,4 @@
1
- /**
2
- * `n-cursor start-check scan|run` — детермінована частина smoke-перевірки
3
- * bun-монорепо для скілу `n-start-check`.
4
- *
5
- * Мотивація: скіл раніше казав LLM-агенту вручну розгортати glob-воркспейси,
6
- * читати кожен `package.json`, класифікувати `start` (сервер vs CLI), запускати
7
- * процес із таймаутом через `perl alarm`, інтерпретувати exit-коди й парсити лог
8
- * на рядки готовності/помилки. Усе це детерміновано — скрипт робить це надійно й
9
- * крос-платформно (`spawnSync` з `timeout`), а агент лишається тільки з
10
- * діагностикою: **чому** саме воркспейс упав.
11
- *
12
- * `scan` — `[{workspace, name, hasStart, startCmd, type}]`.
13
- * `run <ws>` — `{workspace, type, exitCode, timedOut, status, ready, firstError,
14
- * logTail, sideEffects}` (sideEffects — read-only git-diff проти стану до запуску;
15
- * власне відкат лишається явним кроком скіла).
16
- */
1
+ /** @see ./docs/check.md */
17
2
  import { spawnSync } from 'node:child_process'
18
3
  import { existsSync } from 'node:fs'
19
4
  import { readFile } from 'node:fs/promises'
@@ -0,0 +1,34 @@
1
+ # check.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл `n-cursor start-check scan|run` є частиною smoke-перевірки для скілу `n-start-check`. Він автоматично аналізує та запускає воркспейси, визначаючи тип стартового скрипта (сервер чи CLI) та перевіряючи успішність його виконання з обмеженням часу. Результати аналізу та запуску записуються у форматі JSON для подальшого аналізу та діагностики проблем.
6
+
7
+ ## Поведінка
8
+
9
+ - `classifyStartType` визначає, чи є команда `start` CLI чи довгим процесом (сервером).
10
+ - `scanStartWorkspaces` сканує монорепо, визначаючи воркспейси з `start`, їхні команди та типи.
11
+ - `parseStartLog` витягує готовність, першу помилку та хвіст логу з процесу.
12
+ - `runWorkspaceStart` запускає команду `start` воркспейсу з grace-таймаутом, класифікує результат та повертає інформацію про процес.
13
+ - `runStartCheckCli` виконує `scan` або `run` воркспейсу, приймаючи аргументи командного рядка.
14
+
15
+ ## Публічний API
16
+
17
+ - classifyStartType — Визначає, чи є команда `start` сервером або CLI.
18
+ - scanStartWorkspaces — Перевіряє монорепо на наявність команди `start` та її типу у кожному воркспейсі.
19
+ - parseStartLog — Аналізує лог процесу `start` для виявлення статусу, помилок та кінця.
20
+ - runWorkspaceStart — Запускає команду `start` у воркспейсі з обмеженим часом та визначає результат.
21
+ - runStartCheckCli — Запускає CLI для сканування воркспейсів з `start` та індивідуального запуску воркспейсу з подальшим виводом результатів у JSON.
22
+
23
+ ## Гарантії поведінки
24
+
25
+ - Скрипт детерміновано виконує перевірку запуску воркспейса.
26
+ - Скрипт використовує `spawnSync` з таймаутом для запуску процесів.
27
+ - Скрипт інтерпретує exit-коди та парсить логи.
28
+ - Результат перевірки воркспейса представлений у форматі `[{workspace, name, hasStart, startCmd, type}]`.
29
+ - У разі невдачі перевірки, скрипт повертає `false` або `null`.
30
+ - Скрипт не кидає винятків.
31
+ - Скрипт не використовує кешування.
32
+ - Скрипт не взаємодіє з мережею.
33
+ - Результат запуску воркспейса представлений у форматі `{workspace, type, exitCode, timedOut, status, ready, firstError, logTail, sideEffects}`.
34
+ - `sideEffects` містить відкат стану воркспейса до його початкового стану перед запуском.
@@ -1,18 +1,4 @@
1
- /**
2
- * `n-cursor taze diff` — read-only детермінований diff версій залежностей між
3
- * `package.json` і його бекапом `package.json.taze-bak` (root + усі воркспейси
4
- * монорепо), із класифікацією кожної зміни за semver.
5
- *
6
- * Мотивація: скіл `n-taze` раніше казав LLM-агенту вручну порівнювати backup із
7
- * новим `package.json` по всіх воркспейсах і вирішувати, де «змінилась перша
8
- * значуща цифра semver» (major). Це детермінований JSON-diff + semver-логіка —
9
- * скрипт робить це за мілісекунди й без помилок, а агент отримує готовий список
10
- * major-оновлень для справді когнітивної роботи (читання CHANGELOG, рефакторинг).
11
- *
12
- * «Breaking» (major) рахуємо за caret-семантикою — змінилась найлівіша ненульова
13
- * компонента: `1.x→2.x`, `0.4.x→0.5.x`, `0.0.3→0.0.4`. Minor/patch вважаємо
14
- * сумісними.
15
- */
1
+ /** @see ./docs/diff.md */
16
2
  import { existsSync } from 'node:fs'
17
3
  import { readFile } from 'node:fs/promises'
18
4
  import { join } from 'node:path'
@@ -0,0 +1,33 @@
1
+ # diff.mjs
2
+
3
+ ## Огляд
4
+
5
+ Файл `n-cursor taze diff` порівнює поточну версію `package.json` з її резервною копією (`package.json.taze-bak`) для виявлення змін залежностей. Він класифікує ці зміни за семантикою версій (major, minor, patch) та надає список оновлень, які потребують уваги. Це автоматизує процес, який раніше виконувався вручну, забезпечуючи швидкий та точний аналіз змін у залежностях монорепо.
6
+
7
+ ## Поведінка
8
+
9
+ `parseVersion` парсує версійний specifier, ігноруючи range-префікси, і повертає об'єкт з major, minor та patch компонентами, або null, якщо spec не є semver.
10
+ `isBreaking` визначає, чи є перехід від старої до нової версії "breaking" за caret-семантикою.
11
+ `diffPackageJson` порівнює два об'єкти `package.json`, виявляє major-оновлення та підраховує minor/patch зміни для залежностей.
12
+ `collectTazeDiff` збирає diff по всіх воркспейсах монорепо, порівнюючи `package.json` з бекапом, та повертає список major-оновлень, кількість minor/patch змін, загальну кількість порівняних воркспейсів та кількість воркспейсів, які були порівняні.
13
+ `runTazeCli` запускає CLI `n-cursor taze diff`, збирає diff по воркспейсах, та виводить результат у форматі JSON.
14
+
15
+ ## Публічний API
16
+
17
+ - parseVersion — Розбирає semver-версію з специфікатора.
18
+ - isBreaking — Визначає, чи є перехід breaking за caret-семантикою.
19
+ - diffPackageJson — Порівнює два package.json-об'єкти та визначає зміни залежностей.
20
+ - collectTazeDiff — Збирає diff для монорепо, порівнюючи package.json з резервною копією.
21
+ - runTazeCli — Запускає CLI для виведення компактного JSON з інформацією про major-оновлення та кількість minor/patch.
22
+
23
+ ## Гарантії поведінки
24
+
25
+ - Скрипт повертає `true`, якщо всі воркспейси монорепо успішно порівняні.
26
+ - Скрипт повертає `false` та `null`, якщо виникла будь-яка помилка під час порівняння.
27
+ - Результат порівняння завжди є `null`, якщо `package.json` або `package.json.taze-bak` не є валідним JSON.
28
+ - Результат порівняння містить список major-оновлень, визначених за caret-семантикою.
29
+ - Minor та patch оновлення не включаються в результат.
30
+ - Результат завжди детермінований, тобто при однаковому вході скрипт завжди повертає однаковий результат.
31
+ - Скрипт не використовує кешування.
32
+ - Скрипт не кидає винятків.
33
+ - Скрипт перехоплює помилки та повертає `false` та `null`.