@7n/rules 1.49.9 → 1.49.10

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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.49.10] - 2026-07-26
4
+
5
+ ### Fixed
6
+
7
+ - Зареєстровано схему для .kubescape-exceptions.json у каталозі v8r
8
+ - Поважати .n-rules.json:ignore у full-скані v8r
9
+
3
10
  ## [1.49.9] - 2026-07-26
4
11
 
5
12
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules",
3
- "version": "1.49.9",
3
+ "version": "1.49.10",
4
4
  "description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
5
5
  "keywords": [
6
6
  "cli",
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: main.mjs
4
4
  resource: npm/rules/text/run-v8r/main.mjs
5
5
  docgen:
6
- crc: 10f448a2
6
+ crc: 327472a0
7
7
  model: manual
8
8
  ---
9
9
 
@@ -23,10 +23,11 @@ docgen:
23
23
  - `writeResolvedV8rConfig()` — записує `{ cacheTtl, customCatalog: { schemas } }` у `RESOLVED_V8R_CONFIG_PATH` (побічний ефект: файлова операція запису, поза rollback-механізмом лінт-пайплайна).
24
24
  - `runV8rWithGlobs(globs?)` — послідовно запускає `v8r` для кожного glob-у з `V8R_CONFIG_FILE`, вказаним на резольвнутий конфіг; повертає `{ code, detail }` (не голий код): при `code` 0/98 вивід приховано, `detail` порожній; інакше `detail` друкується й повертається код першого невдалого прогону.
25
25
  - `runV8rWithFiles(files)` — delta-режим: один запуск `v8r` по конкретних існуючих шляхах (код 98 неможливий), порожній список — одразу `{ code: 0, detail: '' }`.
26
+ - `findV8rFiles(root)` — збирає full-scope JSON/YAML/TOML-файли через спільний обхід: поважає `.gitignore` та `.n-rules.json:ignore`, повертає відносні шляхи для `v8r`.
26
27
  - `extractFailureLines(combinedText)` — фільтрує `ℹ`-шум і bunx install-вивід з об'єднаного `stdout+stderr` одного запуску `v8r`, лишаючи предметну деталь (`✖ …`-заголовки, ajv-причини). Обидва потоки об'єднуються навмисно: `v8r` непослідовно розкидає деталь між ними залежно від типу помилки (schema violation — причина в stdout, заголовок у stderr; "не знайдено схему" — усе в stderr).
27
28
  - `warnAboutRemoteSchemaFallback(stderrText)` — парсить stderr `v8r` і на кожен файл, чию схему знайдено мережевим fallback-ом (schemastore, не customCatalog), друкує в stdout пораду додати схему в каталог.
28
29
  - `stripBunNodeShimDirs(pathValue)` — прибирає з PATH shim-теки `bun-node-*`, які `bun run --bun` додає з підміненим `node`: дочірній `v8r` (node-shebang) інакше виконувався б під bun і падав на непідтримуваному `node:sea`. Дочірній процес `v8r` завжди отримує очищений PATH.
29
- - `lint(ctx)` — detector `text/run-v8r`: `ctx.files` → delta по відфільтрованих розширеннях, без `ctx.files` → full за `DEFAULT_V8R_GLOBS`. Порушення несе `detail` (якщо є) у тексті `fail()`-повідомлення — без нього LLM fix-worker бачив лише "щось не пройшло" й незмінно провалював усі rung-и драбини (не мав інформації, що саме виправляти).
30
+ - `lint(ctx)` — detector `text/run-v8r`: `ctx.files` → delta по відфільтрованих розширеннях, без `ctx.files` → full через `findV8rFiles`, без `.n-rules.json:ignore`. Порушення несе `detail` (якщо є) у тексті `fail()`-повідомлення — без нього LLM fix-worker бачив лише "щось не пройшло" й незмінно провалював усі rung-и драбини (не мав інформації, що саме виправляти).
30
31
 
31
32
  ## Публічний API
32
33
 
@@ -34,6 +35,7 @@ docgen:
34
35
  - `resolveCustomCatalogSchemas()` — обчислені схеми customCatalog.
35
36
  - `writeResolvedV8rConfig()` — матеріалізація тимчасового конфігу, повертає його шлях.
36
37
  - `runV8rWithGlobs(globs?)`, `runV8rWithFiles(files)` — точки входу перевірки (full/delta), повертають `{ code, detail }`.
38
+ - `findV8rFiles(root)` — full-scope збір файлів із повагою до `.gitignore` та `.n-rules.json:ignore`.
37
39
  - `extractFailureLines(combinedText)` — фільтр noise-рядків для деталі провалу.
38
40
  - `warnAboutRemoteSchemaFallback(stderrText)` — попередження про мережевий fallback схем.
39
41
  - `stripBunNodeShimDirs(pathValue)` — PATH без shim-тек `bun-node-*` (для дочірнього v8r).
@@ -46,13 +46,15 @@
46
46
  */
47
47
  import { existsSync, readFileSync, writeFileSync } from 'node:fs'
48
48
  import { tmpdir } from 'node:os'
49
- import { basename, delimiter, dirname, isAbsolute, join } from 'node:path'
49
+ import { basename, delimiter, dirname, isAbsolute, join, relative } from 'node:path'
50
50
  import { env } from 'node:process'
51
51
  import { fileURLToPath } from 'node:url'
52
52
 
53
53
  import { isRunAsCli } from '../../../scripts/cli-entry.mjs'
54
+ import { loadCursorIgnorePaths } from '../../../scripts/lib/load-cursor-config.mjs'
54
55
  import { resolveCmd } from '../../../scripts/utils/resolve-cmd.mjs'
55
56
  import { spawnAsync } from '../../../scripts/utils/spawn-async.mjs'
57
+ import { walkDir } from '../../../scripts/utils/walkDir.mjs'
56
58
  import { createViolationReporter } from '../../../scripts/lib/lint-surface/violation-reporter.mjs'
57
59
 
58
60
  /** Розширення, які валідує v8r — фільтр delta-списку файлів у `lint(ctx)`. */
@@ -346,6 +348,25 @@ export async function runV8rWithFiles(files, verbose = false) {
346
348
  return { code: r.code === 98 ? 0 : r.code, detail: r.detail }
347
349
  }
348
350
 
351
+ /**
352
+ * Збирає файли форматів v8r для full-режиму, поважаючи `.gitignore` та
353
+ * `.n-rules.json:ignore`, як інші full-scope concern-и.
354
+ * @param {string} root абсолютний корінь репозиторію
355
+ * @returns {Promise<string[]>} відносні до root шляхи файлів для v8r
356
+ */
357
+ export async function findV8rFiles(root) {
358
+ const ignorePaths = await loadCursorIgnorePaths(root)
359
+ const files = []
360
+ await walkDir(
361
+ root,
362
+ file => {
363
+ if (V8R_EXT_RE.test(file)) files.push(relative(root, file))
364
+ },
365
+ ignorePaths
366
+ )
367
+ return files.toSorted((a, b) => a.localeCompare(b))
368
+ }
369
+
349
370
  /**
350
371
  * Будує violation-повідомлення з опційною деталлю `✖ …`-рядків v8r — без неї LLM fix-worker
351
372
  * бачить лише "щось не пройшло" й не має інформації, який файл/поле саме порушує схему.
@@ -358,7 +379,7 @@ function v8rFailMessage(detail) {
358
379
  }
359
380
 
360
381
  /**
361
- * Detector text/run-v8r: read-only v8r по `ctx.files` (delta) або за дефолтними glob-ами (full).
382
+ * Detector text/run-v8r: read-only v8r по `ctx.files` (delta) або всіх форматних файлах поза `.n-rules.json:ignore` (full).
362
383
  * @param {import('../../../scripts/lib/lint-surface/types.mjs').LintContext} ctx контекст lint-прогону
363
384
  * @returns {Promise<import('../../../scripts/lib/lint-surface/types.mjs').LintResult>} результат detector-а
364
385
  */
@@ -369,7 +390,8 @@ export async function lint(ctx) {
369
390
  const verbose = ctx.verbose === true
370
391
 
371
392
  if (ctx.files === undefined) {
372
- const { code, detail } = await runV8rWithGlobs(DEFAULT_V8R_GLOBS, verbose)
393
+ const files = await findV8rFiles(ctx.cwd)
394
+ const { code, detail } = await runV8rWithFiles(files, verbose)
373
395
  if (code !== 0) fail(v8rFailMessage(detail), 'v8r')
374
396
  return reporter.result()
375
397
  }
@@ -20,6 +20,8 @@
20
20
  "fileMatch": [
21
21
  ".licensee.json",
22
22
  "**/.licensee.json",
23
+ ".kubescape-exceptions.json",
24
+ "**/.kubescape-exceptions.json",
23
25
  "docs/specs/**/*.json",
24
26
  "docs/plans/**/*.json",
25
27
  "any.json",