@7n/rules 1.47.1 → 1.48.1

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,28 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.48.1] - 2026-07-24
4
+
5
+ ### Fixed
6
+
7
+ - lint --full: self-upgrade devDependency відкладено до ПІСЛЯ worktree-ізоляції, не забруднює дерево перед dirty-гейтом
8
+ - js/eslint detector: relative-шлях від oxlint резолвиться проти cwd перед відносним обчисленням — усуває '..'-шлях і DetectorError у --full поза .worktrees/
9
+
10
+ ## [1.48.0] - 2026-07-24
11
+
12
+ ### Added
13
+
14
+ - концерн coverage правила test: гейт покриття/мутаційки як lint-детектор (--no-fix = CI-гейт), CoverageProvider порт у plugin-api (spec 2026-07-22 absorb-7n-test)
15
+ - coverage: спільні lib manifest-roots/lcov, подовжений full-таймаут для мутаційного тестування (×4), пілот classify (0.7) у цьому репо
16
+
17
+ ### Changed
18
+
19
+ - doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
20
+ - doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
21
+ - doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
22
+ - doc_comments rollout: header-JSDoc у vitest.config (T0 promote)
23
+ - doc_comments rollout: header/export JSDoc у конфігах demo
24
+ - doc_comments rollout: header-JSDoc у vitest.config
25
+
3
26
  ## [1.47.1] - 2026-07-23
4
27
 
5
28
  ### Fixed
package/bin/n-rules.js CHANGED
@@ -104,6 +104,21 @@ import { runRenameYamlExtensionsCli } from './rename-yaml-extensions.mjs'
104
104
  import { isTazeOrchestratorSkillArgs, runSkillsCli } from '../scripts/skills-cli.mjs'
105
105
  import { syncSetupBunDepsAction } from '../scripts/sync-setup-bun-deps-action.mjs'
106
106
 
107
+ /**
108
+ * Чи потребуватиме `lint <args>` worktree-ізоляції (той самий предикат, що й
109
+ * `needsWorktreeIsolation` у `case 'lint'`, обчислений із сирих CLI-args ДО
110
+ * парсингу `lintOpts`) — щоб self-upgrade devDependency не забруднив дерево
111
+ * ПЕРЕД гейтом чистоти `ensureRunningInWorktree` (той самий клас проблеми,
112
+ * що й `skill taze`, див. коментар над `skipDevDepsEnsure`).
113
+ * @param {string[]} args сирі аргументи після `lint`
114
+ * @returns {boolean} true, якщо `--full` без `--no-fix`/`--path`/`--repo-wide`
115
+ */
116
+ function isLintFullFixArgs(args) {
117
+ return (
118
+ args.includes('--full') && !args.includes('--path') && !args.includes('--repo-wide') && !args.includes('--no-fix')
119
+ )
120
+ }
121
+
107
122
  const PACKAGE_NAME = '@7n/rules'
108
123
  const CONFIG_FILE = '.n-rules.json'
109
124
  /** Публічний URL JSON Schema для поля `$schema` у `.n-rules.json` (IDE); вміст правил CLI читає лише з диска пакету */
@@ -1753,7 +1768,13 @@ try {
1753
1768
  // перед тим гейтом і провалювала б auto-create на інакше чистому дереві —
1754
1769
  // оркестратор сам робить self-upgrade devDependency вже ВСЕРЕДИНІ
1755
1770
  // щойно створеного worktree, після власного гейту чистоти.
1756
- const skipDevDepsEnsure = command === 'skill' && isTazeOrchestratorSkillArgs(args)
1771
+ // `lint --full` (без --no-fix/--path/--repo-wide) той самий клас ризику:
1772
+ // `needsWorktreeIsolation` нижче в `case 'lint'` гейтить на чистоту дерева
1773
+ // ЧЕРЕЗ `ensureRunningInWorktree`; self-upgrade тут забруднив би те саме
1774
+ // дерево прямо перед тим гейтом. Відкладаємо ensure до ПІСЛЯ
1775
+ // `ensureRunningInWorktree` (виклик у `case 'lint'`, спрямований на runCwd).
1776
+ const skipDevDepsEnsure =
1777
+ (command === 'skill' && isTazeOrchestratorSkillArgs(args)) || (command === 'lint' && isLintFullFixArgs(args))
1757
1778
  if (command !== 'ci' && !skipDevDepsEnsure) await ensureNRulesInRootDevDependencies(effectiveRoot)
1758
1779
  // Підкоманди-оркестратори (hook/lint/skill/adr-normalize-local/taze/release тощо)
1759
1780
  // можуть спавнити внутрішню agent/LLM-сесію — ADR Stop-hooks (capture/normalize)
@@ -1846,6 +1867,8 @@ try {
1846
1867
  // ризику, що й taze: якщо запущено поза .worktrees/, треба ізолювати. `--no-fix`
1847
1868
  // (detect-only, нуль мутацій) і не-full (дельта, за дизайном працює на живому
1848
1869
  // дереві задачі, worktree-ізоляція зламала б саму суть дельти) — пропускаємо.
1870
+ // (той самий предикат, що й `isLintFullFixArgs` вище — тримаємо єдиним джерелом,
1871
+ // інакше `skipDevDepsEnsure` і цей гейт можуть розійтись.)
1849
1872
  const needsWorktreeIsolation = full && !noFix
1850
1873
  const worktree = needsWorktreeIsolation
1851
1874
  ? await ensureRunningInWorktree(cwdArg, spawnSync, line => console.log(line), {
@@ -1854,6 +1877,10 @@ try {
1854
1877
  })
1855
1878
  : { cwd: cwdArg, autoCreated: false, branchArg: null }
1856
1879
  const runCwd = worktree.cwd
1880
+ // Ensure відкладений із root-guard-блоку (skipDevDepsEnsure вище) саме для
1881
+ // цього шляху — self-upgrade тепер усередині (auto-created) worktree, ПІСЛЯ
1882
+ // гейту чистоти, а не до нього.
1883
+ if (needsWorktreeIsolation) await ensureNRulesInRootDevDependencies(runCwd)
1857
1884
  // Глобальна черга full-прогонів (spec 2026-07-03): одночасно виконується один
1858
1885
  // `lint --full` на машину, паралельні --full чекають лока і бачать чергу та
1859
1886
  // живий прогрес активного прогону; не-full запуски йдуть без лока
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules",
3
- "version": "1.47.1",
3
+ "version": "1.48.1",
4
4
  "description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
5
5
  "keywords": [
6
6
  "cli",