@7n/rules 1.33.0 → 1.34.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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.34.1] - 2026-07-20
4
+
5
+ ### Fixed
6
+
7
+ - reexecIfPackageVersionChanged порівнював шлях effectivePackageRoot з BUNDLED_PACKAGE_ROOT замість версії — коли npx резолвиться в локальний node_modules/@7n/rules, шлях до і після self-upgrade однаковий, re-exec пропускався, і процес доводив сесію до кінця зі старим кодом у пам'яті V8
8
+
9
+ ## [1.34.0] - 2026-07-20
10
+
11
+ ### Added
12
+
13
+ - doc-files: Vue SFC-екстрактор (`<script setup>`) — extractFactsVue/extractUnitsVue через optional peer vue/compiler-sfc; props/emits/expose/слоти як публічний контракт, юніти зі span-корекцією (ADR 260719-2155)
14
+
15
+ ### Changed
16
+
17
+ - release: @7n/llm-lib@2.8.3, @7n/rules@1.29.2
18
+
3
19
  ## [1.33.0] - 2026-07-20
4
20
 
5
21
  ### Added
package/bin/n-rules.js CHANGED
@@ -1397,20 +1397,26 @@ async function readBundledVersionAt(packageRoot) {
1397
1397
  * версії через `spawnSync` і завершує поточний процес із успадкованим exit-кодом. Re-exec потрібен,
1398
1398
  * бо ES-модулі вже завантажені у V8 (RULE_MIGRATIONS, detectAutoRules тощо) і нова логіка
1399
1399
  * без повної заміни процесу не підхопиться. Захист від нескінченного циклу — env `NITRA_CURSOR_REEXEC=1`.
1400
+ *
1401
+ * Порівнює версії, **не** шляхи: коли `npx` резолвиться в локальний
1402
+ * `<projectRoot>/node_modules/@7n/rules` (проєкт уже має пакет у devDependencies),
1403
+ * `effectivePackageRoot` до і після `upgradeNRulesToLatestAndBunInstall` — той самий шлях,
1404
+ * `bun i` лише перезаписує файли за ним in-place. Читати "поточну" версію з цього шляху
1405
+ * ПІСЛЯ апгрейду означало б читати вже НОВУ версію — порівняння завжди збігалося б і
1406
+ * re-exec ніколи не спрацьовував би, попри те що в памʼяті процесу лишається старий код.
1407
+ * Тому `startVersion` фіксується викликачем ДО апгрейду.
1400
1408
  * @param {string} effectivePackageRoot шлях, повернутий `upgradeNRulesToLatestAndBunInstall`
1409
+ * @param {string | null} startVersion версія `@7n/rules`, з якою стартував процес (прочитана
1410
+ * з `BUNDLED_PACKAGE_ROOT` до виклику `upgradeNRulesToLatestAndBunInstall`)
1401
1411
  * @returns {Promise<void>} повертається лише якщо re-exec не потрібен; інакше кидає `ReexecHandoff`,
1402
1412
  * який ловить top-level catch і прокидає exit-код у `process.exitCode`
1403
1413
  */
1404
- async function reexecIfPackageVersionChanged(effectivePackageRoot) {
1414
+ async function reexecIfPackageVersionChanged(effectivePackageRoot, startVersion) {
1405
1415
  if (env.NITRA_CURSOR_REEXEC === '1') {
1406
1416
  return
1407
1417
  }
1408
- if (effectivePackageRoot === BUNDLED_PACKAGE_ROOT) {
1409
- return
1410
- }
1411
- const currentVersion = await readBundledVersionAt(BUNDLED_PACKAGE_ROOT)
1412
1418
  const installedVersion = await readBundledVersionAt(effectivePackageRoot)
1413
- if (!currentVersion || !installedVersion || currentVersion === installedVersion) {
1419
+ if (!startVersion || !installedVersion || startVersion === installedVersion) {
1414
1420
  return
1415
1421
  }
1416
1422
  const newBinPath = join(effectivePackageRoot, 'bin', 'n-rules.js')
@@ -1418,7 +1424,7 @@ async function reexecIfPackageVersionChanged(effectivePackageRoot) {
1418
1424
  return
1419
1425
  }
1420
1426
  console.log(
1421
- `🔁 Перезапуск ${PACKAGE_NAME}: процес стартував на ${currentVersion}, ` +
1427
+ `🔁 Перезапуск ${PACKAGE_NAME}: процес стартував на ${startVersion}, ` +
1422
1428
  `після self-upgrade встановлено ${installedVersion}.\n` +
1423
1429
  ` Re-exec свіжого бінаря, щоб підхопити нову логіку (RULE_MIGRATIONS, auto-detect тощо).\n`
1424
1430
  )
@@ -1456,11 +1462,13 @@ async function runSync() {
1456
1462
  console.log(`\n🔧 ${PACKAGE_NAME} — завантаження cursor-правил\n`)
1457
1463
 
1458
1464
  const projectRoot = cwd()
1465
+ // Фіксуємо ДО апгрейду — див. коментар над reexecIfPackageVersionChanged.
1466
+ const startVersion = await readBundledVersionAt(BUNDLED_PACKAGE_ROOT)
1459
1467
  const effectivePackageRoot = await runSyncStep(`❌ Не вдалося оновити ${PACKAGE_NAME} або виконати bun i: `, () =>
1460
1468
  upgradeNRulesToLatestAndBunInstall(projectRoot, BUNDLED_PACKAGE_ROOT)
1461
1469
  )
1462
1470
 
1463
- await reexecIfPackageVersionChanged(effectivePackageRoot)
1471
+ await reexecIfPackageVersionChanged(effectivePackageRoot, startVersion)
1464
1472
 
1465
1473
  const bundledRulesDir = join(effectivePackageRoot, 'rules')
1466
1474
  const bundledSkillsDir = join(effectivePackageRoot, 'skills')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/rules",
3
- "version": "1.33.0",
3
+ "version": "1.34.1",
4
4
  "description": "CLI еталонних правил і skills (префікс n-): синк у репозиторій, дельта-lint, конформність",
5
5
  "keywords": [
6
6
  "cli",