@7n/rules 1.49.24 → 1.49.25

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.49.25] - 2026-07-27
4
+
5
+ ### Fixed
6
+
7
+ - Збережено --path scope у doc-files fixer
8
+
3
9
  ## [1.49.24] - 2026-07-27
4
10
 
5
11
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules",
3
- "version": "1.49.24",
3
+ "version": "1.49.25",
4
4
  "description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
5
5
  "keywords": [
6
6
  "cli",
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: fix-worker.mjs
4
4
  resource: npm/rules/doc-files/check/fix-worker.mjs
5
5
  docgen:
6
- crc: 452ab360
6
+ crc: 444c817d
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  issues: judge:inaccurate:0.98
@@ -18,7 +18,7 @@ docgen:
18
18
  ## Поведінка
19
19
 
20
20
  1. Викликається `fixWorker`.
21
- 2. Скануються файли для визначення застарілих документів (рукописні доки без docgen-frontmatter — не цілі).
21
+ 2. З порушень, знайдених detector-ом, відновлюються повні цілі застарілих документів; fixer не робить нового повного обходу checkout. Тому hook і `lint doc-files --path` генерують docs лише для власного explicit scope (рукописні доки без docgen-frontmatter — не цілі).
22
22
  3. Якщо знайдені застарілі документи, кожна цільова дока реєструється durable через `ctx.recordDurableWrite` (fallback — `ctx.recordWrite`), а потім запускається генерація батчу через `runGenerationBatch`.
23
23
  4. Батч отримує м'який дедлайн — 80% від `ctx.timeoutMs` рунга: генерація сама зупиняється до backstop-таймауту, повертає частковий прогрес штатно й не лишає фонового батчу поверх наступного rung-а. Дедлайн діє і всередині файлу: `generateDoc` ріже per-call LLM-таймаути під залишок бюджету, тож навіть перший файл, що не вкладається у рунг, обривається сам (transient), а не по backstop-таймеру runner-а.
24
24
  5. Фільтруються порушення, що стосуються сирітських документів (вихідні файли видалені); pre-image кожного реєструється у `ctx.recordWrite`.
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: main.mjs
4
4
  resource: npm/rules/doc-files/check/main.mjs
5
5
  docgen:
6
- crc: dd3f8c2a
6
+ crc: b5921123
7
7
  ---
8
8
 
9
9
  ## Огляд
@@ -12,7 +12,7 @@ Lint-детектор doc-files: знаходить застарілі файл
12
12
 
13
13
  ## Поведінка
14
14
 
15
- `lint(ctx)` збирає застарілі доки через `collectStale` (для конкретного набору змінених файлів або, якщо файлів не передано, повним скануванням дерева) і додає для кожної окреме порушення з причиною (`missing`/`crc-mismatch`/`degraded`) та шляхом джерела. Окремо сканує `docs/`-теки на сирітські доки (`scanOrphanedDocs`) джерело яких більше не існує.
15
+ `lint(ctx)` збирає застарілі доки через `collectStale` (для конкретного набору змінених файлів або, якщо файлів не передано, повним скануванням дерева) і додає для кожної окреме порушення з причиною (`missing`/`crc-mismatch`/`degraded`) та шляхом джерела. Сирітські доки (`scanOrphanedDocs`) перевіряються лише за повного repo-wide скану: explicit files від hook або `--path` не мають безпечної межі для такого обходу, тому не можуть зачіпати docs поза своїм scope.
16
16
 
17
17
  Реверс-мапінг: якщо серед змінених файлів трапляється сама `.md`-дока (а не її джерело), `sourceForDoc` шукає відповідний вихідний файл поруч (той самий basename, легальне розширення) і саме його передає далі в перевірку застарілості — так зміна доки теж тригерить звірку CRC її джерела.
18
18
 
@@ -24,16 +24,19 @@ const DEADLINE_FRACTION = 0.8
24
24
  /** @type {FixWorkerFn} */
25
25
  export async function fixWorker(violations, ctx) {
26
26
  const { cwd } = ctx
27
- const { scanForDocFiles } = await import('../docgen-scan/main.mjs')
27
+ const { describeFile } = await import('../docgen-scan/main.mjs')
28
28
  const { runGenerationBatch, purgeOrphanedDocs } = await import('../docgen-files-batch/main.mjs')
29
29
 
30
30
  /** @type {string[]} */
31
31
  const touchedFiles = []
32
32
  const recordDoc = ctx.recordDurableWrite ?? ctx.recordWrite
33
33
 
34
- // Re-scan дає повні target-обʼєкти {sourcePath, docPath, reason, …}, що їх потребує
35
- // runGenerationBatch (violation несе лише file+docPath).
36
- const stale = scanForDocFiles(cwd).filter(f => f.stale)
34
+ // Відновлюємо повні target-обʼєкти лише для порушень detector-а. Повний re-scan
35
+ // тут ігнорував би explicit files від hook/`lint --path` і генерував би docs
36
+ // для всього checkout.
37
+ const stale = [...new Set(violations.filter(v => v.reason !== 'orphaned-doc' && v.file).map(v => v.file))]
38
+ .map(sourcePath => describeFile(cwd, sourcePath))
39
+ .filter(f => f.stale)
37
40
  if (stale.length > 0) {
38
41
  for (const f of stale) {
39
42
  const docAbs = join(cwd, f.docPath)
@@ -86,14 +86,19 @@ export function lint(ctx) {
86
86
  })
87
87
  )
88
88
  }
89
- for (const orphan of scanOrphanedDocs(cwd)) {
90
- violations.push(
91
- /** @type {Partial<import('../../../scripts/lib/lint-surface/types.mjs').LintViolation>} */ ({
92
- reason: 'orphaned-doc',
93
- message: `сирітський док (source видалено): ${orphan}`,
94
- file: orphan
95
- })
96
- )
89
+ // Явний files-набір (hook/--path) не містить межі дерева для безпечного
90
+ // orphan-скану. Повний скан тут порушив би scope і міг би видалити доки поза
91
+ // сервісом, тому orphan-cleanup лишається лише repo-wide прогоном.
92
+ if (files === undefined) {
93
+ for (const orphan of scanOrphanedDocs(cwd)) {
94
+ violations.push(
95
+ /** @type {Partial<import('../../../scripts/lib/lint-surface/types.mjs').LintViolation>} */ ({
96
+ reason: 'orphaned-doc',
97
+ message: `сирітський док (source видалено): ${orphan}`,
98
+ file: orphan
99
+ })
100
+ )
101
+ }
97
102
  }
98
103
 
99
104
  const unavailable = unavailableDocFilesPlugins(cwd)