@nitra/cursor 12.9.0 → 12.11.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 (175) hide show
  1. package/.claude-template/settings.template.json +1 -23
  2. package/CHANGELOG.md +12 -0
  3. package/bin/n-cursor.js +8 -43
  4. package/docs/stryker.config.md +0 -2
  5. package/lib/docs/llm.md +16 -21
  6. package/lib/docs/omlx.md +20 -25
  7. package/lib/llm.mjs +25 -7
  8. package/lib/omlx.mjs +10 -3
  9. package/package.json +1 -1
  10. package/rules/abie/docs/main.md +0 -2
  11. package/rules/abie/lib/docs/http-route.md +0 -2
  12. package/rules/abie/main.mdc +0 -22
  13. package/rules/adr/docs/main.md +0 -2
  14. package/rules/adr/js/docs/hooks.md +16 -26
  15. package/rules/adr/js/hooks.mjs +59 -0
  16. package/rules/adr/main.mdc +0 -9
  17. package/rules/bun/docs/main.md +0 -2
  18. package/rules/bun/main.mdc +1 -15
  19. package/rules/capacitor/docs/main.md +0 -2
  20. package/rules/capacitor/main.mdc +0 -6
  21. package/rules/changelog/docs/main.md +0 -2
  22. package/rules/changelog/js/agent-workflow.mdc +1 -1
  23. package/rules/changelog/js/consistency.mjs +57 -3
  24. package/rules/changelog/js/docs/consistency.md +26 -24
  25. package/rules/changelog/js/docs/index.md +2 -2
  26. package/rules/changelog/main.mdc +0 -5
  27. package/rules/ci4/docs/main.md +0 -2
  28. package/rules/ci4/main.mdc +0 -5
  29. package/rules/doc-files/docs/main.md +0 -2
  30. package/rules/doc-files/js/docs/docgen-crc.md +0 -2
  31. package/rules/doc-files/js/docs/docgen-extract.md +0 -2
  32. package/rules/doc-files/js/docs/docgen-files-batch.md +0 -2
  33. package/rules/doc-files/js/docs/docgen-gen.md +0 -2
  34. package/rules/doc-files/js/docs/docgen-judge-measure.md +0 -2
  35. package/rules/doc-files/js/docs/docgen-judge.md +0 -2
  36. package/rules/doc-files/js/docs/docgen-scan.md +0 -2
  37. package/rules/doc-files/js/docs/run-lint.md +0 -2
  38. package/rules/docker/docs/main.md +0 -2
  39. package/rules/docker/js/docs/lint.md +0 -2
  40. package/rules/docker/lib/docs/docker-hadolint.md +0 -2
  41. package/rules/docker/main.mdc +1 -21
  42. package/rules/efes/docs/main.md +0 -2
  43. package/rules/efes/main.mdc +0 -1
  44. package/rules/feedback/docs/main.md +0 -2
  45. package/rules/ga/docs/main.md +0 -2
  46. package/rules/ga/js/docs/index.md +0 -1
  47. package/rules/ga/main.mdc +1 -31
  48. package/rules/graphql/docs/main.md +0 -2
  49. package/rules/graphql/main.mdc +0 -5
  50. package/rules/hasura/docs/main.md +0 -2
  51. package/rules/hasura/js/docs/index.md +3 -3
  52. package/rules/hasura/js/docs/migrations.md +0 -2
  53. package/rules/hasura/main.mdc +1 -11
  54. package/rules/image-avif/docs/main.md +0 -2
  55. package/rules/image-avif/main.mdc +1 -9
  56. package/rules/image-compress/docs/main.md +0 -2
  57. package/rules/image-compress/js/docs/index.md +0 -1
  58. package/rules/image-compress/main.mdc +1 -9
  59. package/rules/js/docs/main.md +0 -2
  60. package/rules/js/js/dep-policy.mjs +8 -4
  61. package/rules/js/js/docs/check.md +0 -2
  62. package/rules/js/js/docs/dep-policy.md +10 -12
  63. package/rules/js/js/docs/index.md +5 -5
  64. package/rules/js/js/docs/tooling.md +0 -2
  65. package/rules/js/js/docs/utils_imports.md +0 -2
  66. package/rules/js/main.mdc +0 -31
  67. package/rules/js-bun-db/docs/main.md +0 -2
  68. package/rules/js-bun-db/js/docs/safety.md +18 -23
  69. package/rules/js-bun-db/js/safety.mjs +31 -3
  70. package/rules/js-bun-db/lib/bun-sql-scan.mjs +123 -0
  71. package/rules/js-bun-db/lib/docs/bun-sql-scan.md +37 -331
  72. package/rules/js-bun-db/main.mdc +1 -23
  73. package/rules/js-bun-redis/docs/main.md +0 -2
  74. package/rules/js-bun-redis/main.mdc +0 -5
  75. package/rules/js-mssql/docs/main.md +0 -2
  76. package/rules/js-mssql/main.mdc +0 -12
  77. package/rules/js-run/docs/main.md +0 -2
  78. package/rules/js-run/js/docs/runtime.md +15 -13
  79. package/rules/js-run/js/runtime.mjs +48 -4
  80. package/rules/js-run/main.mdc +0 -25
  81. package/rules/k8s/docs/main.md +0 -2
  82. package/rules/k8s/main.mdc +0 -45
  83. package/rules/nginx-default-tpl/docs/main.md +0 -2
  84. package/rules/nginx-default-tpl/main.mdc +0 -13
  85. package/rules/npm-module/docs/main.md +0 -2
  86. package/rules/npm-module/js/docs/header_doc_pointer.md +0 -2
  87. package/rules/npm-module/js/docs/rule_meta.md +0 -2
  88. package/rules/npm-module/js/docs/skill_meta.md +0 -2
  89. package/rules/npm-module/main.mdc +1 -15
  90. package/rules/php/docs/main.md +0 -2
  91. package/rules/php/js/docs/index.md +0 -1
  92. package/rules/php/main.mdc +1 -9
  93. package/rules/python/docs/main.md +0 -2
  94. package/rules/python/js/docs/index.md +0 -1
  95. package/rules/python/main.mdc +1 -13
  96. package/rules/python/policy/lint_python_yml/lint_python_yml.rego +9 -0
  97. package/rules/python/policy/pyproject_toml/pyproject_toml.rego +15 -1
  98. package/rules/rego/docs/main.md +0 -2
  99. package/rules/rego/js/docs/index.md +2 -2
  100. package/rules/rego/js/docs/tooling.md +0 -2
  101. package/rules/rego/js/tooling.mdc +14 -0
  102. package/rules/rego/main.mdc +0 -9
  103. package/rules/rego/policy/package_json/package_json.mdc +12 -0
  104. package/rules/release/docs/main.md +0 -2
  105. package/rules/release/main.mdc +2 -2
  106. package/rules/rust/docs/main.md +0 -2
  107. package/rules/rust/js/docs/index.md +0 -1
  108. package/rules/rust/main.mdc +1 -11
  109. package/rules/rust/policy/package_json/package_json.mdc +12 -0
  110. package/rules/security/docs/main.md +0 -2
  111. package/rules/security/js/docs/index.md +0 -1
  112. package/rules/security/main.mdc +0 -13
  113. package/rules/style/docs/main.md +0 -2
  114. package/rules/style/js/docs/index.md +2 -2
  115. package/rules/style/js/docs/tooling.md +0 -2
  116. package/rules/style/main.mdc +1 -23
  117. package/rules/tauri/docs/main.md +0 -2
  118. package/rules/tauri/main.mdc +1 -11
  119. package/rules/test/docs/main.md +0 -2
  120. package/rules/test/js/docs/no-console-store-restore.md +0 -2
  121. package/rules/test/js/docs/sandbox-aware-test.md +0 -2
  122. package/rules/test/js/docs/stryker_config.md +0 -2
  123. package/rules/test/js/docs/vitest-config-pool-forks.md +0 -2
  124. package/rules/test/main.mdc +1 -21
  125. package/rules/text/docs/main.md +0 -2
  126. package/rules/text/js/docs/cspell-fix.md +0 -2
  127. package/rules/text/js/docs/run-dotenv-linter.md +0 -2
  128. package/rules/text/js/docs/run-shellcheck.md +0 -2
  129. package/rules/text/js/docs/run-v8r.md +0 -2
  130. package/rules/text/main.mdc +0 -33
  131. package/rules/tool-surface/docs/main.md +0 -2
  132. package/rules/vue/docs/main.md +0 -2
  133. package/rules/vue/js/docs/packages.md +12 -17
  134. package/rules/vue/js/packages.mjs +41 -1
  135. package/rules/vue/main.mdc +0 -22
  136. package/rules/worktree/docs/main.md +0 -2
  137. package/scripts/docs/auto-rules.md +0 -2
  138. package/scripts/docs/auto-skills.md +0 -2
  139. package/scripts/docs/hook.md +13 -12
  140. package/scripts/docs/post-tool-use-check.md +0 -2
  141. package/scripts/docs/sync-claude-config.md +1 -3
  142. package/scripts/docs/sync-setup-bun-deps-action.md +0 -2
  143. package/scripts/hook.mjs +3 -4
  144. package/scripts/lib/docs/check-mdc-template-refs.md +0 -2
  145. package/scripts/lib/docs/index.md +35 -35
  146. package/scripts/lib/docs/inline-template-links.md +6 -8
  147. package/scripts/lib/docs/list-project-rules-mdc.md +0 -2
  148. package/scripts/lib/docs/list-rule-ids.md +0 -2
  149. package/scripts/lib/docs/mirror-parity.md +8 -10
  150. package/scripts/lib/docs/read-n-cursor-config-lite.md +0 -2
  151. package/scripts/lib/docs/rule-meta.md +0 -2
  152. package/scripts/lib/docs/run-lint.md +0 -2
  153. package/scripts/lib/docs/run-rule-cli.md +0 -2
  154. package/scripts/lib/docs/run-rule.md +0 -2
  155. package/scripts/lib/docs/run-standard-lint.md +0 -2
  156. package/scripts/lib/docs/run-standard-rule.md +0 -2
  157. package/scripts/lib/docs/skill-meta.md +0 -2
  158. package/scripts/lib/docs/timing-summary.md +0 -2
  159. package/scripts/lib/docs/worktree-notice.md +0 -2
  160. package/scripts/lib/fix/docs/analyze-escalation.md +0 -2
  161. package/scripts/lib/fix/docs/index.md +1 -0
  162. package/scripts/lib/fix/docs/llm-worker.md +18 -8
  163. package/scripts/lib/fix/docs/orchestrator.md +10 -16
  164. package/scripts/lib/fix/docs/run-conformance-check.md +0 -2
  165. package/scripts/lib/fix/docs/t0.md +0 -2
  166. package/scripts/lib/fix/docs/verbose-block.md +27 -0
  167. package/scripts/lib/fix/llm-worker.mjs +75 -22
  168. package/scripts/lib/fix/orchestrator.mjs +9 -3
  169. package/scripts/lib/fix/verbose-block.mjs +82 -0
  170. package/scripts/lib/inline-template-links.mjs +32 -22
  171. package/scripts/lib/mirror-parity.mjs +2 -2
  172. package/scripts/sync-claude-config.mjs +7 -4
  173. package/scripts/utils/docs/resolve-js-root.md +0 -2
  174. package/skills/doc-files/SKILL.md +9 -24
  175. package/skills/llm-patch/SKILL.md +4 -4
@@ -55,6 +55,9 @@ function gitignoreLineCoversHookLog(line, logPath) {
55
55
  if (line === '.claude/hooks/*.log' || line === '.claude/hooks/**/*.log') {
56
56
  return true
57
57
  }
58
+ if (line === '.claude/hooks/*' || line === '.claude/hooks/**') {
59
+ return true
60
+ }
58
61
  if (line === '*.log' || line === '**/*.log') {
59
62
  return true
60
63
  }
@@ -264,6 +267,60 @@ function checkLlmCliAvailable(reporter) {
264
267
  * @param {string} [cwd] корінь репозиторію
265
268
  * @returns {Promise<number>} 0 — все OK, 1 — є проблеми
266
269
  */
270
+ /** Файли стану/блокування normalize-хука, які не мають потрапляти в git. */
271
+ const NORMALIZE_STATE_FILES = ['.normalize-state', '.normalize.lock']
272
+ const CLAUDE_HOOKS_REL = '.claude/hooks'
273
+
274
+ /**
275
+ * Перевіряє рядок `.gitignore` на покриття конкретного state/lock файлу.
276
+ * @param {string} line нормалізований (trim) рядок
277
+ * @param {string} statePath відносний шлях файлу (наприклад `.claude/hooks/.normalize-state`)
278
+ * @returns {boolean} true — рядок покриває файл
279
+ */
280
+ function gitignoreLineCoversStatePath(line, statePath) {
281
+ if (line === statePath) return true
282
+ // .claude/hooks/* або .claude/hooks/**
283
+ if (line === `${CLAUDE_HOOKS_REL}/*` || line === `${CLAUDE_HOOKS_REL}/**`) return true
284
+ return false
285
+ }
286
+
287
+ /**
288
+ * Перевіряє `.gitignore` на наявність рядків для файлів стану normalize-хука.
289
+ * @param {import('../../../scripts/lib/check-reporter.mjs').CheckReporter} reporter
290
+ * @param {string} cwd корінь репозиторію
291
+ * @returns {Promise<void>}
292
+ */
293
+ async function checkGitignoreForStateFiles(reporter, cwd) {
294
+ const { pass, fail } = reporter
295
+ const gitignoreAbs = join(cwd, '.gitignore')
296
+ const content = existsSync(gitignoreAbs) ? await readFile(gitignoreAbs, 'utf8') : ''
297
+ const lines = content.split(EOL_RE).map(l => l.trim())
298
+ for (const file of NORMALIZE_STATE_FILES) {
299
+ const statePath = `${CLAUDE_HOOKS_REL}/${file}`
300
+ if (lines.some(l => gitignoreLineCoversStatePath(l, statePath))) {
301
+ pass(`.gitignore покриває ${statePath}`)
302
+ } else {
303
+ fail(`.gitignore не ігнорує \`${statePath}\` — додай рядок (adr.mdc)`)
304
+ }
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Перевіряє наявність каталогу `docs/adr/` — обов'язкового місця зберігання ADR-ів.
310
+ * @param {import('../../../scripts/lib/check-reporter.mjs').CheckReporter} reporter
311
+ * @param {string} cwd корінь репозиторію
312
+ * @returns {void}
313
+ */
314
+ function checkDocsAdrDir(reporter, cwd) {
315
+ const { pass, fail } = reporter
316
+ const adrDir = join(cwd, 'docs', 'adr')
317
+ if (existsSync(adrDir)) {
318
+ pass('docs/adr/ існує (каталог ADR-ів)')
319
+ } else {
320
+ fail('docs/adr/ відсутній — створи каталог для ADR-ів (adr.mdc)')
321
+ }
322
+ }
323
+
267
324
  export async function check(cwd = process.cwd()) {
268
325
  const reporter = createCheckReporter()
269
326
  for (const { scriptName } of HOOK_ARTIFACTS) {
@@ -272,6 +329,8 @@ export async function check(cwd = process.cwd()) {
272
329
  checkProjectSettings(reporter, cwd)
273
330
  await checkCursorHooks(reporter, cwd)
274
331
  await checkGitignore(reporter, cwd)
332
+ await checkGitignoreForStateFiles(reporter, cwd)
333
+ checkDocsAdrDir(reporter, cwd)
275
334
  checkLlmCliAvailable(reporter)
276
335
  return reporter.getExitCode()
277
336
  }
@@ -6,8 +6,6 @@ version: '2.2'
6
6
 
7
7
  Правило `adr` автоматично фіксує архітектурні рішення (ADR) після кожної сесії через Stop-хуки і батч-нормалізує чернетки у канонічний формат MADR v4.
8
8
 
9
- [adr-madr-format](./js/madr_format.mdc)
10
-
11
9
  ## Stop-hook у `.claude/settings.json`
12
10
 
13
11
  Канонічний запис, який вставляє sync (поряд із PostToolUse fix-хуком — той живе в іншій події, тут не показаний):
@@ -76,10 +74,3 @@ Cursor Agent читає project-level **`.cursor/hooks.json`**. `npx @nitra/curs
76
74
  | `adr.settings_json` | `.claude/settings.json` | Наявність обох Stop-хуків у `hooks.Stop[]` |
77
75
  | `adr.settings_local_json` | `.claude/settings.local.json` | Відсутність дублів Stop-хуків у local-файлі |
78
76
 
79
- [adr-settings-policy](./js/settings_policy.mdc)
80
-
81
- [adr-settings_json-policy](./policy/settings_json/settings_json.mdc)
82
-
83
- [adr-settings_local_json-policy](./policy/settings_local_json/settings_local_json.mdc)
84
-
85
- [adr-hooks](./js/hooks.mdc)
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль валідує дані, застосовуючи правила, визначені у конфігурації meta.json, та збирає посилання на MDC. При виклику публічної функції run він здійснює повний запуск правила, включаючи завантаження конфігурацій та застосування білих списків. Результат виконання повертається як код виходу процесу.
14
12
 
15
13
  ## Поведінка
@@ -5,18 +5,4 @@ alwaysApply: false
5
5
  version: '2.1'
6
6
  ---
7
7
 
8
- Проект використовує тільки Bun для керування залежностями та запуску скриптів.
9
-
10
- [bun-layout](./js/layout.mdc)
11
-
12
- [bun-bunfig](./js/bunfig.mdc)
13
-
14
- [bun-package_json](./js/package_json.mdc)
15
-
16
- [bun-lint](./js/lint.mdc)
17
-
18
- ## Швидкий gate через conftest
19
-
20
- [bun-policy-bunfig](./policy/bunfig/bunfig.mdc)
21
-
22
- [bun-policy-package_json](./policy/package_json/package_json.mdc)
8
+ Проект використовує тільки Bun для керування залежностями та запуску скриптів.
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль застосовує політику та логіку, визначену в конфігурації meta.json, для валідації. При запуску як CLI ініціюється повний запуск правила, що включає завантаження конфігурацій, застосування білих списків та підбиття підсумків. Модуль є лише для читання (не виконує записів у файлову систему чи базу даних) і використовує кешування даних у межах одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -7,12 +7,6 @@ version: '1.1'
7
7
 
8
8
  Правило перевіряє версію `@capacitor/core` у `package.json` та коректність використання CocoaPods/SPM у iOS-шарі Capacitor-проєкту.
9
9
 
10
- [capacitor-version](./js/version.mdc)
11
-
12
- [capacitor-ios-spm](./js/ios_spm.mdc)
13
-
14
10
  ## Швидкий gate через conftest
15
11
 
16
- [capacitor-package_json](./policy/package_json/package_json.mdc)
17
-
18
12
  JS-перевірка (`platforms.mjs`) — authoritative: підтримує `||`-діапазони, hyphen-range, workspace-monorepo та iOS-специфічну логіку (Podfile).
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль відповідає за виконання політики, використовуючи дані з meta.json. Він забезпечує перевірку та застосування логіки, визначеної в конфігурації. Виклик функції run ініціює процес виконання правила, включаючи кешування даних у межах одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Якщо в цій сесії ти змінив(ла) файли в пакетному workspace** (код, rego, правила, скіли, скрипти, конфіги, тести — **не** лише `docs/` / `doc/`) — **не завершуй задачу**, поки не виконаєш **усі три** кроки нижче в **тому ж** наборі змін. Це не «опційно після синку» — це частина PR.
4
4
 
5
- 1. **Поклади change-файл** `<ws>/.changes/YYMMDD-HHMM.md` з frontmatter `bump:` (`major|minor|patch`) + `section:` (`Added|Changed|Fixed|Removed`) і текстом опису. Команда: `npx @nitra/cursor change --bump <…> --section <…> --message "<…>" [--ws <шлях>]`. Якщо файл за ту саму хвилину вже існує, CLI атомарно створює `YYMMDD-HHMM-2.md`, потім `-3` тощо.
5
+ 1. **Поклади change-файл** `<ws>/.changes/YYMMDD-HHMM.md` з frontmatter `bump:` (`major|minor|patch`) + `section:` (`Added|Changed|Fixed|Removed`) і текстом опису. Команда: `npx @7n/n ch [--bump <…>] [--section <…>] [--message "<…>"]` автоматично знаходить зачеплені workspaces за git status і пише окремий change-файл у кожен; без `--message` генерує опис через omlx з diff.
6
6
  2. **Ніколи** не редагуй `version` і `CHANGELOG.md` вручну — навіть для hotfix. Єдиний артефакт зміни — change-файл; `version`/CHANGELOG формує `n-cursor release` у CI на `main` (агрегує change-файли, ставить git-тег `<name>@<version>`). Будь-яка зміна `version` поза CI (drift від бази чи опублікованої) завалює `check changelog` — навіть якщо поряд є change-файл.
7
7
  3. **`npx @nitra/cursor fix changelog`** → exit **`0`** (достатньо наявності change-файлу; `version` лишається незмінним).
8
8
 
@@ -1,5 +1,7 @@
1
1
  /** @see ./docs/consistency.md */
2
2
  import { execFile } from 'node:child_process'
3
+ import { existsSync } from 'node:fs'
4
+ import { readFile } from 'node:fs/promises'
3
5
  import { join } from 'node:path'
4
6
  import { promisify } from 'node:util'
5
7
 
@@ -379,6 +381,46 @@ function createDefaultGetPublishedVersion() {
379
381
  * @param {(msg: string) => void} pass параметр
380
382
  * @param {(msg: string) => void} fail параметр
381
383
  */
384
+ /**
385
+ * Перевіряє наявність `CHANGELOG.md` у воркспейсі.
386
+ * @param {string} ws відносний шлях воркспейсу від кореня репо
387
+ * @param {string} label мітка для повідомлень
388
+ * @param {string} cwd корінь репозиторію
389
+ * @param {(msg: string) => void} pass
390
+ * @param {(msg: string) => void} fail
391
+ * @returns {boolean} true — файл існує
392
+ */
393
+ function checkChangelogFileExists(ws, label, cwd, pass, fail) {
394
+ const path = join(cwd, ws, 'CHANGELOG.md')
395
+ if (existsSync(path)) {
396
+ pass(`${label}: CHANGELOG.md існує`)
397
+ return true
398
+ }
399
+ fail(`${label}: CHANGELOG.md відсутній — створи файл за форматом Keep a Changelog (n-changelog.mdc)`)
400
+ return false
401
+ }
402
+
403
+ /**
404
+ * Перевіряє базовий формат `CHANGELOG.md`: наявність H1 `# Changelog`.
405
+ * Версійні секції `## [x.y.z]` не вимагаються для нових workspace-ів без релізів.
406
+ * @param {string} ws відносний шлях воркспейсу від кореня репо
407
+ * @param {string} label мітка для повідомлень
408
+ * @param {string} cwd корінь репозиторію
409
+ * @param {(msg: string) => void} pass
410
+ * @param {(msg: string) => void} fail
411
+ * @returns {Promise<void>}
412
+ */
413
+ async function checkChangelogFormat(ws, label, cwd, pass, fail) {
414
+ const path = join(cwd, ws, 'CHANGELOG.md')
415
+ const content = await readFile(path, 'utf8')
416
+ const hasH1 = content.split('\n').some(l => l.trimEnd() === '# Changelog')
417
+ if (hasH1) {
418
+ pass(`${label}: CHANGELOG.md має рядок "# Changelog"`)
419
+ } else {
420
+ fail(`${label}: CHANGELOG.md не має рядка "# Changelog" — перший рядок має бути H1-заголовком (n-changelog.mdc)`)
421
+ }
422
+ }
423
+
382
424
  function checkNpmFilesArrayContainsChangelog(manifest, pass, fail) {
383
425
  if (manifest.kind !== 'npm' || !manifest.npmFiles) return
384
426
  const pkgPath = manifestFilePath(manifest.ws, manifest)
@@ -406,7 +448,7 @@ function workspaceLabel(manifest) {
406
448
  function missingChangeFileMessage(label, mf) {
407
449
  return (
408
450
  `${label}: є релевантні зміни, але немає change-файлу (version у ${mf} не чіпай вручну). ` +
409
- `Поклади change-файл: npx @nitra/cursor change --bump <major|minor|patch> --section <Added|Changed|Fixed|Removed> --message "<…>"; ` +
451
+ `Поклади change-файл: npx @7n/n ch [--bump <major|minor|patch>] [--section <Added|Changed|Fixed|Removed>] [--message "<…>"]; ` +
410
452
  `bump зробить CI на main (n-changelog.mdc)`
411
453
  )
412
454
  }
@@ -542,6 +584,10 @@ async function checkPublishedWorkspacePendingGitChanges(manifest, _Vcurrent, sub
542
584
  async function checkPublishedWorkspace(manifest, subWorkspaces, getPublishedVersion, autofix, pass, fail, cwd) {
543
585
  const label = workspaceLabel(manifest)
544
586
  const mf = manifestFilePath(manifest.ws, manifest)
587
+ const changelogExists = checkChangelogFileExists(manifest.ws, label, cwd, pass, fail)
588
+ if (changelogExists) {
589
+ await checkChangelogFormat(manifest.ws, label, cwd, pass, fail)
590
+ }
545
591
  const Vcurrent = manifest.version
546
592
  if (!Vcurrent) {
547
593
  fail(`${label}: у ${mf} відсутнє поле version (registry-published воркспейс)`)
@@ -574,7 +620,7 @@ async function checkPublishedWorkspace(manifest, subWorkspaces, getPublishedVers
574
620
  fail(
575
621
  `${label}: version у ${mf} (${Vcurrent}) випереджає опубліковану (${Vpublished}) — ` +
576
622
  `ручний bump поза CI заборонено. Відкоти version і поклади change-файл ` +
577
- `(npx @nitra/cursor change …); bump зробить CI на main (n-changelog.mdc)`
623
+ `(npx @7n/n ch); bump зробить CI на main (n-changelog.mdc)`
578
624
  )
579
625
  return
580
626
  }
@@ -613,7 +659,7 @@ async function checkLocalOnlyChangedWorkspace(comparisonRef, manifest, baseLabel
613
659
  if (Vbase !== null && Vcurrent !== null && versionIsAhead(Vcurrent, Vbase)) {
614
660
  fail(
615
661
  `${label}: version у ${mf} змінено поза CI (${Vbase} → ${Vcurrent}) — ручний bump заборонено (на ${baseLabel} — ${Vbase}). ` +
616
- `Відкоти version і поклади change-файл (npx @nitra/cursor change …); bump зробить CI (n-changelog.mdc)`
662
+ `Відкоти version і поклади change-файл (npx @7n/n ch); bump зробить CI (n-changelog.mdc)`
617
663
  )
618
664
  return
619
665
  }
@@ -635,6 +681,14 @@ async function checkLocalOnlyChangedWorkspace(comparisonRef, manifest, baseLabel
635
681
  async function runLocalOnlyChecks(localOnly, subWorkspaces, autofix, pass, fail, cwd) {
636
682
  if (localOnly.length === 0) return
637
683
 
684
+ for (const manifest of localOnly) {
685
+ const label = workspaceLabel(manifest)
686
+ const exists = checkChangelogFileExists(manifest.ws, label, cwd, pass, fail)
687
+ if (exists) {
688
+ await checkChangelogFormat(manifest.ws, label, cwd, pass, fail)
689
+ }
690
+ }
691
+
638
692
  if (!(await isInsideGitRepo(cwd))) {
639
693
  pass('changelog: не git-репозиторій — local-only перевірку пропущено')
640
694
  return
@@ -3,36 +3,38 @@ type: JS Module
3
3
  title: consistency.mjs
4
4
  resource: npm/rules/changelog/js/consistency.mjs
5
5
  docgen:
6
- crc: eaf98d6d
7
- score: 100
6
+ crc: a9bebf31
7
+ model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
+ score: 95
8
9
  ---
9
10
 
10
- Перевіряє версіонування проектів у монорепозиторії, порівнюючи версії, зазначені в маніфестах, з даними, отриманими з мережі з https://pypi.org/pypi/. Аналізує відповідність версій встановленим правилам, визначеним у конфігурації res.json. Визначає, чи відповідають версії формату, а також перевіряє наявність змін, порівнюючи їх із даними, описаними у (n-changelog.mdc). При невдачі перевірки повертає false/null, не кидаючи винятків.
11
+ ## Огляд
12
+
13
+ Модуль сканує монорепозиторій, ідентифікує проєкти та порівнює їхні версії з даними, отриманими з https://pypi.org/pypi/, для верифікації відповідності версій. Для проєктів, що не призначені для публікації, виконуються локальні перевірки на відповідність файлу `CHANGELOG.md` конфігурації, визначеній у res.json.
11
14
 
12
15
  ## Поведінка
13
16
 
14
- 1. Ініціалізує репортер для збору результатів перевірки.
15
- 2. Визначає робочий каталог та стан autofix-режиму.
16
- 3. Зчитує всі кореневі каталоги проектів у монорепо.
17
- 4. Класифікує кожен проект як публікувальний (registryPublishable) або локальний.
18
- 5. Для кожного публікувального проекту виконує перевірку:
19
- а. Зчитує маніфест проекту.
20
- б. Якщо у маніфесті відсутнє ім'я або поле version, фіксує помилку.
21
- в. Якщо є change-файл(и) у .changes/, фіксує успіх, оскільки bump зробить CI (n-changelog.mdc), і перевіряє наявність "CHANGELOG.md" у файлах проекту.
22
- г. Якщо немає change-файлу, визначає точку порівняння на основі поточної гілки.
23
- д. Порівнює версію в маніфесті з опублікованою версією (за допомогою npm view або запиту до https://pypi.org/pypi/).
24
- е. Якщо версія в маніфесті випереджає опубліковану, фіксує помилку, оскільки ручний bump поза CI заборонений.
25
- ж. Якщо версія в маніфесті позаду опублікованої, фіксує успіх, оскільки це відставання локального репозиторію від реєстру.
26
- з. Якщо версії збігаються, перевіряє змінений код відносно точки порівняння. Якщо зміни є, але немає change-файлу, викликає механізм фіксації або фіксує помилку, надаючи підказку для використання команди `npx @nitra/cursor change`.
27
- 6. Для кожного локального проекту виконує перевірку:
28
- а. Зчитує маніфест проекту.
29
- б. Визначає точку порівняння на основі поточної гілки.
30
- в. Перевіряє, чи є релевантні зміни у проекті відносно точки порівняння.
31
- г. Якщо зміни є, але немає change-файлу, викликає механізм фіксації або фіксує помилку, надаючи підказку для використання команди `npx @nitra/cursor change`.
32
- 7. Повертає кінцевий код виходу, що відображає результат перевірки.
17
+ 1. `check` ініціалізує репортер для збору результатів перевірки.
18
+ 2. `check` визначає робочий каталог та режим автоматичного виправлення на основі змінних середовища.
19
+ 3. `check` знаходить усі кореневі каталоги проєктів у монорепозиторії.
20
+ 4. `check` класифікує знайдені проєкти на ті, що можуть бути опубліковані в реєстрі, та ті, що є локальними.
21
+ 5. Для кожного проєкту, що може бути опублікованим, `check` перевіряє його відповідність вимогам:
22
+ а. Перевіряє наявність файлу `CHANGELOG.md`.
23
+ б. Перевіряє базовий формат `CHANGELOG.md` на наявність заголовка `# Changelog`.
24
+ в. Якщо проєкт має поле `version` у маніфесті, `check` порівнює його з опублікованою версією, отриманою через мережевий запит до https://pypi.org/pypi/ або `npm view`.
25
+ г. Якщо версія у проєкті випереджає опубліковану, `check` повідомляє про заборонений ручний bump.
26
+ д. Якщо версія у проєкті відстає від опублікованої, `check` повідомляє про відставання локальної копії від реєстру.
27
+ е. Якщо версії збігаються, `check` перевіряє, чи є незрелі зміни у проєкті відносно базового релізу.
28
+ ж. Якщо проєкт має незрелі зміни, `check` перевіряє наявність change-файлу. Якщо його немає, `check` або повідомляє про необхідність створити його (якщо не в режимі autofix), або автоматично створює його та додає до індексу.
29
+ 6. `check` виконує локальні перевірки для проєктів, які не призначені для публікації:
30
+ а. Для кожного локального проєкту `check` перевіряє наявність файлу `CHANGELOG.md` та його формат.
31
+ б. `check` визначає точку порівняння (базу) на основі поточної гілки.
32
+ в. `check` перевіряє, чи є релевантні зміни у проєкті відносно цієї бази.
33
+ г. Якщо зміни є, `check` перевіряє наявність change-файлу. Якщо його немає, `check` або повідомляє про необхідність створити його (якщо не в режимі autofix), або автоматично створює його та додає до індексу.
34
+ 7. `check` повертає кінцевий код завершення, що відображає результати всіх перевірок.
33
35
 
34
36
  ## Гарантії поведінки
35
37
 
36
- - Read-only: файл не виконує операцій запису у файлову систему.
38
+ - Read-only: не виконує операцій запису (ФС/БД).
37
39
  - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
38
- - За невдалої перевірки повертає `false`/`null` замість винятку.
40
+ - За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
@@ -6,6 +6,6 @@ resource: npm/rules/changelog/js/
6
6
 
7
7
  # npm/rules/changelog/js
8
8
 
9
- | Файл | Тип |
10
- | --------------------------------- | --------- |
9
+ | Файл | Тип |
10
+ |---|---|
11
11
  | [consistency.mjs](consistency.md) | JS Module |
@@ -6,8 +6,3 @@ alwaysApply: true
6
6
 
7
7
  У кожному **пакетному** workspace (каталог із `package.json` або `pyproject.toml`) має бути власний **`CHANGELOG.md`**. Спільного на репозиторій змісту змін **не існує** — кожен пакет веде свій. Маніфест версії: **JS/Bun/npm** — `package.json` (`version`); **Python** — `pyproject.toml` (`[project].version` або `[tool.poetry].version`).
8
8
 
9
- [changelog-agent-workflow](./js/agent-workflow.mdc)
10
-
11
- [changelog-comparison-models](./js/comparison-models.mdc)
12
-
13
- [changelog-format](./js/changelog-format.mdc)
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль валідує дані відповідно до правил, використовуючи конфігурацію, визначену в meta.json. Він застосовує білий список та виконує логіку перевірки. При запуску як окрема програма, він повертає код виходу, що інформує про успіх чи виявлені порушення. Модуль є Read-only, тобто не здійснює записів у файлову систему чи бази даних. Кешування даних відбувається у межах одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -372,8 +372,3 @@ Rego-перевірки, що запускаються через `conftest` у
372
372
  | --------------------------- | -------------------------------------------------------------------- |
373
373
  | `ci4.vscode_extensions` | `.vscode/extensions.json` містить `arr.marksman` у `recommendations` |
374
374
 
375
- [ci4-marksman_config](./js/marksman_config.mdc)
376
-
377
- [ci4-vscode_extensions](./js/vscode_extensions.mdc)
378
-
379
- [ci4-vscode_extensions-policy](./policy/vscode_extensions/vscode_extensions.mdc)
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль перевіряє відповідність конфігурацій політики джерелам коду, спираючись на `meta.json`. Він також аналізує документацію на відповідність джерелам коду, виявляючи застарілі або нерелевантні описи.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль забезпечує роботу з метаданими та оцінкою якості документів. Він дозволяє парсити метадані з Markdown-файлів за допомогою `parseDocFrontmatter`, створювати та заповнювати блоки метаданих за допомогою `buildDocFrontmatter`. Документи можуть бути промарковані за допомогою `stampDoc`. Якість документа оцінюється за допомогою `readDocQuality`, а його актуальність визначається функцією `staleness`, яка використовує `crc32` для перевірки хеш-суми. Модель документа зчитується через `readDocModel`.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль витягує структурований факт-лист з вмісту файлів, звертаючись до мережі. Функція `extractFacts` аналізує вміст файлів, визначаючи публічні експорти, локальні символи та поведінкові маркери для Rust та JavaScript/TypeScript файлів. При цьому ігноруються системні та залежності, включаючи каталоги `.github`, `.git`, `node_modules`, `base/`, `ua/` та `.firebase`. Результати аналізу кешуються протягом одного прогону.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль керує життєвим циклом документації. Він вибирає цілі для оновлення за допомогою `selectTargets`, очищає від неіснуючих джерел за допомогою `purgeOrphanedDocs`, запускає генерацію файлів через `runDocFilesGenCli` та `runDocFilesStampCli`, а також виконує пакетну генерацію за допомогою `runGenerationBatch`. Усі операції виконуються з механізмом перехоплення помилок, що запобігає виникненню винятків назовні.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль забезпечує повний цикл роботи з документами: відокремлює захищений блок за допомогою `splitProtected`, вставляє його у визначене місце за допомогою `insertProtected`, генерує повний Markdown-документ через `generateDoc` (з використанням `DEFAULT_LOCAL_MODEL`), а також оцінює якість документа за допомогою `scoreDoc`. Кешування застосовується протягом прогону. (abie.mdc)
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Файл аналізує надані файли коду, створюючи документацію та оцінюючи її якість відповідно до конфігурації, що міститься у report.json. Процес збирає результати для кожного файлу, використовуючи кешування у межах прогону на основі вмісту джерела та вже згенерованої документації. У кінці процес агрегує дані та зберігає повний звіт у report.json, а також виводить його у консоль.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль реалізує механізм оцінки якості документації. Він визначає модель для оцінки за допомогою `JUDGE_MODEL`, перевіряє статус активності гейту через `JUDGE_ENABLED` та встановлює поріг впевненості за допомогою `JUDGE_CONFIDENCE`. Модуль отримує, парсить та визначає фінальний статус документації, викликаючи `judgeDoc` для отримання висновків, а також може використовувати `judgeFailsDoc` для визначення провалу.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль визначає, які файли є кодовим джерелом за допомогою `isSourceFile`. Він обчислює відповідні шляхи до Markdown-документів для коду за допомогою `docPathForSource`. Модуль ідентифікує потенційні кандидати для документування за допомогою `isDocCandidate` та надає опис файлу за допомогою `describeFile`. Для аналізу файлової системи використовуються `scanOrphanedDocs` для пошуку "сирітських" документів та `scanForDocFiles` для сканування файлів. Модуль також може визначати кореневий каталог за допомогою `resolveRoot` та виконувати сканування файлів документації через `runDocFilesScanCli` або перевірку через `runDocFilesCheckCli`.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 80
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Цей модуль надає CLI-обгортку для канонічного `lint-doc-files` (doc-files.mdc): детермінованого детектора застарілості файлових док (`<dir>/docs/<stem>.md`). При відсутності прапорців або при вказанні шляхів (`[paths…]`) виконується повний або точковий детекст застарілості. Якщо знайдено застарілі файли, повертається код виходу 1. Можливі режими: `--missing-only` звужує перевірку до відсутніх файлів. Прапорець `--json` виводить JSON-лістинг усіх кандидатів. Режими `--hook`, `--git` та `--degraded` делегують перевірку через `runDocFilesCheckCli` (hook-протокол: exit 2/0). Повний прогін здійснюється через `runStandardLint` (ключ `lint-doc-files`), тоді як хук/git/degraded форми використовують канон scripts.mdc, не генеруючи логів. Поведінка описується у (doc-files.mdc).
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль виконує перевірку на відповідність логіці JS-зацікавленостей, політикам та посиланням MDC. Запуск правила ініціюється через публічну функцію `run`.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль аналізує файли `Dockerfile` та `Containerfile` у репозиторії, використовуючи `isDockerfileName` та `findDockerfilePaths` для ідентифікації конфігурацій. Він розбиває знайдені файли на етапи за допомогою `parseFromStages` та `splitDockerfileStages`. Модуль перевіряє конфігурацію, використовуючи `check` та `lint`, щоб оцінити відповідність стандартам, враховуючи дані з `package.json`. Він визначає інформацію про багатоетапну збірку, теги образів та права користувача, відповідно до вимог (docker.mdc).
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Спільна логіка виклику hadolint для шляхів до Dockerfile. Модуль створює стандартизовані відносні шляхи з прямими слешами. Він ініціює перевірку Dockerfile, використовуючи hadolint як нативний бінарник, який резолвиться через `ensureTool` (PATH → кеш → авто-install brew/scoop/GitHub Release per-platform). Для отримання інформації про встановлення можна звертатися до https://github.com/hadolint/hadolint/releases. Публічна функція `lintDockerfileWithHadolint` виконує перевірку за правилом `n-cursor lint docker` / check-docker.
14
12
 
15
13
  ## Поведінка
@@ -11,24 +11,4 @@ alwaysApply: false
11
11
 
12
12
  ## Активація
13
13
 
14
- Спрацьовує на всі файли `Dockerfile*`; `check docker` (`fix.mjs`) обробляє також `Containerfile` та `Containerfile.*`.
15
-
16
- ## Швидкий gate через conftest
17
-
18
- [docker-lint_docker_yml](./policy/lint_docker_yml/lint_docker_yml.mdc)
19
-
20
- [docker-mirror](./js/mirror.mdc)
21
-
22
- [docker-multistage](./js/multistage.mdc)
23
-
24
- [docker-compile](./js/compile.mdc)
25
-
26
- [docker-native-addon](./js/native-addon.mdc)
27
-
28
- [docker-non-root](./js/non-root.mdc)
29
-
30
- [docker-nginx-tag](./js/nginx-tag.mdc)
31
-
32
- [docker-nginx-user](./js/nginx-user.mdc)
33
-
34
- [docker-hadolint](./js/hadolint.mdc)
14
+ Спрацьовує на всі файли `Dockerfile*`; `check docker` (`fix.mjs`) обробляє також `Containerfile` та `Containerfile.*`.
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль перевіряє відповідність коду визначеним правилам, використовуючи конфігурацію з meta.json. Він виконує аналіз, який може бути ініційований через публічну функцію run. Модуль є read-only, тобто не здійснює записів у файлову систему чи бази даних. Кешування даних відбувається у межах одного прогону. При завершенні роботи як окремий інструмент, він надає підсумковий звіт.
14
12
 
15
13
  ## Поведінка
@@ -20,4 +20,3 @@ bun add -d @nitra/efes-shared
20
20
 
21
21
  Пакети (директорія в **`npm/rules/efes/policy/`** → namespace → що перевіряє):
22
22
 
23
- [efes-package_json_shared](./policy/package_json_shared/package_json_shared.mdc)
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 100
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Модуль перевіряє відповідність даних заданим правилам, використовуючи конфігурації, політики та посилання на MDC, які визначаються у meta.json. Він застосовує білий список для формування підсумку. Публічний інтерфейс run завершує роботу, інформуючи про успішне виконання або виявлені порушення. Модуль є Read-only і не виконує записів у файлову систему чи бази даних.
14
12
 
15
13
  ## Поведінка
@@ -8,8 +8,6 @@ docgen:
8
8
  score: 90
9
9
  ---
10
10
 
11
- ## Огляд
12
-
13
11
  Цей модуль є CLI-обгорткою над канонічним `lint-ga` (ga.mdc). Він автоматично встановлює `shellcheck` та `conftest` через `ensureTool` (використовуючи brew/scoop/GitHub Release залежно від платформи), перевіряє наявність `uv` (для `uvx zizmor`), а потім послідовно виконує `bunx github-actionlint`, `uvx zizmor --offline --collect=workflows .` та делегує до `rules/ga/check.mjs::check`. Функція `lint` викликає `runLintGaCli`, який є частиною оркестраторного адаптера `n-cursor lint ga`. При відсутності `uv`, користувачеві надається підказка з командою встановлення, наприклад, https://astral.sh/uv/install.sh, оскільки `uv` не в реєстрі `ensureTool`.
14
12
 
15
13
  ## Поведінка
@@ -8,5 +8,4 @@ resource: npm/rules/ga/js/
8
8
 
9
9
  | Файл | Тип |
10
10
  | ----------------------------- | --------- |
11
- | [lint.mjs](lint.md) | JS Module |
12
11
  | [workflows.mjs](workflows.md) | JS Module |