mjolnir-qa 0.5.11 → 0.5.13

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/README.ru.md CHANGED
@@ -15,7 +15,7 @@ CI-пайплайны, выдаёт показатель достойности
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | Русский | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -298,15 +298,15 @@ macOS и Linux.
298
298
 
299
299
  ### Сколько из этого измерено
300
300
 
301
- **74 из 99 правил несут ложную положительную частоту, измеренную на
301
+ **78 из 99 правил несут ложную положительную частоту, измеренную на
302
302
  реальном OSS-коде** (по ≥ 10 вручную классифицированных находок на
303
- правило; см. [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Остальные 19
303
+ правило; см. [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Остальные 21
304
304
  выходят на оценке автора. Футер каждого скана говорит, сколько из
305
305
  _сработавших_ правил измерены; `mjolnir rules --unmeasured` перечисляет
306
306
  неизмеренные; страница `mjolnir explain` каждого правила указывает её
307
307
  статус. Мы публикуем частоту, даже когда она уродлива — QA-CS-103
308
- аудируется на 95 % и за это отправлен в карантин. Увеличивать эти 78 —
309
- постоянная работа проекта.
308
+ аудируется на 95 % и за это отправлен в карантин. Увеличивать это
309
+ число — постоянная работа проекта.
310
310
 
311
311
  ### Тиры правил и зрелость языков
312
312
 
@@ -457,14 +457,14 @@ FAILING declines an expired card (e2e/checkout.spec.ts)
457
457
  изменение теста в диффе; оно не доказывает, что система верификации в
458
458
  целом заслуживает доверия — и видит только показанный ему дифф.
459
459
 
460
- | | AI-код-ревью (Copilot и пр.) | **Mjölnir** |
461
- | ------------------------------------------- | :------------------------------: | :-----------------------------: |
462
- | Цена за скан | Токены (растут с размером диффа) | **Ноль** (локально, установлен) |
463
- | Видит весь сьют + все CI-конфиги | Только PR-дифф, показанный ему | **Всё, каждый раз** |
464
- | Детерминирован (тот же вход → тот же выход) | ❌ (недетерминирован) | **✅** |
465
- | Ловит паттерны, дремлющие месяцами | Только если в контексте | **✅** (сканирует все файлы) |
466
- | Помнит находки между запусками | ❌ (нет памяти между сессиями) | **✅** (baseline + diff) |
467
- | Запускается без человека | Нужен PR или промпт | **✅** (CI-хук, 3 секунды) |
460
+ | | AI-код-ревью (Copilot и пр.) | **Mjölnir** |
461
+ | ------------------------------------------- | :------------------------------: | :-------------------------------------: |
462
+ | Цена за скан | Токены (растут с размером диффа) | **Ноль** (локально, установлен) |
463
+ | Видит весь сьют + все CI-конфиги | Только PR-дифф, показанный ему | **Всё, каждый раз** |
464
+ | Детерминирован (тот же вход → тот же выход) | ❌ (недетерминирован) | **✅** |
465
+ | Ловит паттерны, дремлющие месяцами | Только если в контексте | **✅** (сканирует все файлы) |
466
+ | Помнит находки между запусками | ❌ (нет памяти между сессиями) | **✅** (baseline + diff) |
467
+ | Запускается без человека | Нужен PR или промпт | **✅** (CI-хук, выполняется за секунды) |
468
468
 
469
469
  **Используйте оба.** AI ловит нюанс, замысел и дизайнерские изъяны,
470
470
  которые не найдёт ни один regex. Mjölnir ловит структурные паттерны,
@@ -589,11 +589,20 @@ JSON/SARIF-отчёт — `schemaVersion: 1`. ID правил
589
589
  с частотой ложных срабатываний из реального OSS-кода (см.
590
590
  [Сколько из этого измерено](#сколько-из-этого-измерено)); футер скана
591
591
  и `mjolnir rules --unmeasured` скажут, какие какие.
592
- - **Доверие к плагинам** — плагины — это npm-пакеты, объявленные в
593
- `"plugins"`. **Песочницы нет**: код плагина работает с полными
592
+ - **Доверие к плагинам и ворота исполнения** — плагины — это npm-пакеты,
593
+ объявленные в
594
+ `"plugins"`; JS-модули живут в `mjolnir-rules/*.mjs`.
595
+ **Песочницы нет**: код плагина работает с полными
594
596
  привилегиями Node, та же модель доверия, что у плагинов ESLint или
595
- Vitest. Префиксы ID основных правил зарезервированы и отвергаются от
596
- плагинов против подмены.
597
+ Vitest. Именно поэтому исполнение кода — **opt-in при каждом скане**:
598
+ передайте `--enable-plugins` (или задайте
599
+ `MJOLNIR_ENABLE_PLUGINS=1`), иначе источники НЕ загружаются —
600
+ громкое уведомление в stderr точно перечисляет пропущенное. Сканирование
601
+ недоверенного кода никогда его не исполняет. JSON-манифесты правил
602
+ (`mjolnir-rules/*.json`) не затронуты: они декларируют regex-паттерны
603
+ и по конструкции не исполняют код. Префиксы ID основных правил
604
+ зарезервированы и отвергаются от
605
+ плагинов и внешних правил против подмены.
597
606
  - **Workspace-локальные внешние правила** (фолдерные, ноль сети) —
598
607
  каталог `mjolnir-rules/` рядом с целью скана загружает собственные
599
608
  правила: JSON-файлы декларируют regex-паттерны (код не исполняется),
package/README.th.md CHANGED
@@ -15,7 +15,7 @@ CI pipelines รายงานคะแนนความน่าเชื่
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | ไทย | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -290,13 +290,13 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
290
290
 
291
291
  ### วัดไปแล้วเท่าไร
292
292
 
293
- **74 จาก 99 กฎ มีอัตรา false positive ที่วัดกับโค้ด OSS จริง** (อย่างน้อย
293
+ **78 จาก 99 กฎ มีอัตรา false positive ที่วัดกับโค้ด OSS จริง** (อย่างน้อย
294
294
  10 findings ที่จัดหมวดด้วยมือต่อกฎ; ดู
295
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)) อีก 19 กฎออกมาบนการประเมินของผู้เขียน
295
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)) อีก 21 กฎออกมาบนการประเมินของผู้เขียน
296
296
  ส่วนท้ายของทุกการสแกนบอกว่ากฎที่ _ยิง_ มีกี่กฎที่วัดแล้ว;
297
297
  `mjolnir rules --unmeasured` แสดงกฎที่ยังไม่วัด; หน้า `mjolnir explain`
298
298
  ของทุกกฎระบุสถานะ เราเผยแพร่อัตรานี้แม้มันจะน่าเกลียด — QA-CS-103 ตรวจได้
299
- ที่ 95 % และถูกส่งไปกักกันเพราะเหตุนี้ การทำให้ตัวเลข 78 นั้นโตขึ้นคืองาน
299
+ ที่ 95 % และถูกส่งไปกักกันเพราะเหตุนี้ การทำให้ตัวเลขนั้นโตขึ้นคืองาน
300
300
  ต่อเนื่องของโปรเจกต์
301
301
 
302
302
  ### Tier ของกฎและความสุกงอมของภาษา
@@ -451,7 +451,7 @@ diff ได้ แต่มันไม่พิสูจน์ว่าระ
451
451
  | กำหนดตาย (input เดียวกัน → output เดียวกัน) | ❌ (ไม่กำหนดตาย) | **✅** |
452
452
  | จับรูปแบบที่หลับมาหลายเดือน | เฉพาะถ้าอยู่ในบริบท | **✅** (สแกนทุกไฟล์) |
453
453
  | จำ finding ข้ามการรัน | ❌ (ไม่มีความจำข้ามเซสชัน) | **✅** (baseline + diff) |
454
- | รันโดยไม่ต้องมีคนสั่ง | ต้องมี PR หรือ prompt | **✅** (hook CI, 3 วินาที) |
454
+ | รันโดยไม่ต้องมีคนสั่ง | ต้องมี PR หรือ prompt | **✅** (hook CI, รันในไม่กี่วินาที) |
455
455
 
456
456
  **ใช้ทั้งสอง** AI เก็บรายละเอียดปลีกย่อย เจตนา และข้อบกพร่องเชิงออกแบบ
457
457
  ที่ regex หาไม่เจอ Mjölnir เก็บรูปแบบเชิงโครงสร้างที่ AI มองข้ามเพราะ
@@ -566,10 +566,17 @@ Mjölnir เป็น zero-config `mjolnir.config.json` (หรือ `.mjolnir.
566
566
  - **วัด ไม่ใช่อ้าง** — เฉพาะกฎที่มีอัตรา false positive จากโค้ด OSS จริง
567
567
  จึงอยู่ใน tier พาดหัว (ดู [วัดไปแล้วเท่าไร](#วัดไปแล้วเท่าไร));
568
568
  ส่วนท้ายการสแกนและ `mjolnir rules --unmeasured` บอกว่ากฎไหนสถานะไหน
569
- - **ความไว้วางใจต่อปลั๊กอิน** — ปลั๊กอินคือแพ็กเกจ npm ประกาศใต้
570
- `"plugins"` **ไม่มี sandbox**: โค้ดปลั๊กอินรันด้วยสิทธิ์ Node เต็ม
571
- โมเดลความไว้วางใจเดียวกับปลั๊กอิน ESLint หรือ Vitest คำนำหน้า rule ID
572
- ของ core สงวนไว้และถูกปฏิเสธจากปลั๊กอิน เพื่อกันการอ้างปลอม
569
+ - **ความไว้วางใจต่อปลั๊กอินและประตูการรันโค้ด** — ปลั๊กอินคือแพ็กเกจ npm ประกาศใต้
570
+ `"plugins"`; โมดูล JS อยู่ใน `mjolnir-rules/*.mjs`
571
+ **ไม่มี sandbox**: โค้ดปลั๊กอินรันด้วยสิทธิ์ Node เต็ม
572
+ โมเดลความไว้วางใจเดียวกับปลั๊กอิน ESLint หรือ Vitest ด้วยเหตุนี้
573
+ การรันโค้ดจึงเป็น **opt-in ในทุกการสแกน**: ส่ง `--enable-plugins`
574
+ (หรือตั้ง `MJOLNIR_ENABLE_PLUGINS=1`) ไม่งั้นซอร์สจะไม่ถูกโหลด —
575
+ แจ้งเตือนบน stderr อย่างชัดเจนว่าข้ามอะไรไปบ้าง การสแกนโค้ดที่ไม่
576
+ น่าเชื่อถือไม่เคยรันมัน ไฟล์ JSON rule manifest (`mjolnir-rules/*.json`)
577
+ ไม่ได้รับผลกระทบ: ประกาศ regex pattern และไม่รันโค้ดโดยการออกแบบ
578
+ คำนำหน้า rule ID ของ core สงวนไว้และถูกปฏิเสธจากปลั๊กอินและกฎภายนอก
579
+ เพื่อกันการอ้างปลอม
573
580
  - **กฎภายนอกประจำ workspace** (อิงโฟลเดอร์ ศูนย์เครือข่าย) — ไดเรกทอรี
574
581
  `mjolnir-rules/` ติดกับเป้าสแกนโหลดกฎกำหนดเอง: ไฟล์ JSON ประกาศรูปแบบ
575
582
  regex (ไม่รันโค้ด) โมดูล `.mjs`/`.js` export `rules` (ความไว้วางใจ
package/README.tr.md CHANGED
@@ -15,7 +15,7 @@ olarak nerede kırıldığını gösterir.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | Türkçe | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -294,14 +294,14 @@ Toplam 20 Python kuralı (QA-PY-001…012 pytest hijyeni + QA-PY-101…108 Playw
294
294
 
295
295
  ### Ne kadarı ölçülmüş
296
296
 
297
- **99 kuraldan 74'ü, gerçek OSS koduna karşı ölçülmüş bir yanlış pozitif
297
+ **99 kuraldan 78'sı, gerçek OSS koduna karşı ölçülmüş bir yanlış pozitif
298
298
  oranı taşıyor** (her biri için ≥ 10 elle sınıflandırılmış bulgu; bkz.
299
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Diğer 19'u yazarın tahminine göre
299
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Diğer 21'i yazarın tahminine göre
300
300
  yayına giriyor. Her tarama alt bilgisi, _tetiklenen_ kuralların kaçının
301
301
  ölçüldüğünü söyler; `mjolnir rules --unmeasured` ölçülmeyenleri listeler;
302
302
  her kuralın `mjolnir explain` sayfası durumunu belirtir. Oranı çirkin
303
303
  olduğunda bile yayımlarız — QA-CS-103 %95 ile denetleniyor ve bu yüzden
304
- karantinada. O 78'i büyütmek, projenin süregelen işidir.
304
+ karantinada. O sayıyı büyütmek, projenin süregelen işidir.
305
305
 
306
306
  ### Kural katmanları ve dil olgunluğu
307
307
 
@@ -454,14 +454,14 @@ Farklı sorun, farklı katman. AI incelemesi bir diff'teki şüpheli test
454
454
  değişikliğini fark edebilir; doğrulama sisteminin bütünüyle güvenilir
455
455
  olduğunu kanıtlamaz — ve yalnızca ona gösterdiğiniz diff'i görür.
456
456
 
457
- | | AI kod incelemesi (Copilot vb.) | **Mjölnir** |
458
- | -------------------------------------------- | :-------------------------------: | :---------------------------: |
459
- | Tarama başına maliyet | Token (diff boyutuyla ölçeklenir) | **Sıfır** (yerel, kurulu) |
460
- | Tüm takımı + tüm CI yapılandırmalarını görür | Yalnızca gösterdiğiniz PR diff'i | **Her şey, her seferinde** |
461
- | Belirleyici (aynı girdi → aynı çıktı) | ❌ (belirsiz) | **✅** |
462
- | Aylardır uyuyan örüntüleri yakalar | Yalnızca bağlamdaysa | **✅** (tüm dosyaları tarar) |
463
- | Çalıştırmalar arasında bulguları hatırlar | ❌ (oturumlar arası bellek yok) | **✅** (baseline + diff) |
464
- | İnsan tetiklemesi olmadan çalışır | PR veya prompt gerekir | **✅** (CI kancası, 3 saniye) |
457
+ | | AI kod incelemesi (Copilot vb.) | **Mjölnir** |
458
+ | -------------------------------------------- | :-------------------------------: | :-------------------------------------------: |
459
+ | Tarama başına maliyet | Token (diff boyutuyla ölçeklenir) | **Sıfır** (yerel, kurulu) |
460
+ | Tüm takımı + tüm CI yapılandırmalarını görür | Yalnızca gösterdiğiniz PR diff'i | **Her şey, her seferinde** |
461
+ | Belirleyici (aynı girdi → aynı çıktı) | ❌ (belirsiz) | **✅** |
462
+ | Aylardır uyuyan örüntüleri yakalar | Yalnızca bağlamdaysa | **✅** (tüm dosyaları tarar) |
463
+ | Çalıştırmalar arasında bulguları hatırlar | ❌ (oturumlar arası bellek yok) | **✅** (baseline + diff) |
464
+ | İnsan tetiklemesi olmadan çalışır | PR veya prompt gerekir | **✅** (CI kancası, saniyeler içinde çalışır) |
465
465
 
466
466
  **İkisini de kullanın.** AI, hiçbir regex'in bulamayacağı nüansı, niyeti
467
467
  ve tasarım kusurlarını yakalar. Mjölnir, AI'nın «kasıtlı» göründükleri
@@ -585,11 +585,18 @@ kullanılmaz.
585
585
  yanlış pozitif oranı olan kurallar başlık katmanlarına girer (bkz.
586
586
  [Ne kadarı ölçülmüş](#ne-kadarı-ölçülmüş)); tarama alt bilgisi ve
587
587
  `mjolnir rules --unmeasured` hangisinin ne olduğunu söyler.
588
- - **Eklenti güveni** — eklentiler `"plugins"` altında bildirilen npm
589
- paketleridir. **Sandbox yok**: eklenti kodu tam Node ayrıcalıklarıyla
590
- çalışır; ESLint veya Vitest eklentileriyle aynı güven modeli. Çekirdek
588
+ - **Eklenti güveni ve yürütme kapısı** — eklentiler `"plugins"` altında
589
+ bildirilen npm paketleridir; JS modülleri `mjolnir-rules/*.mjs`
590
+ içinde yaşar. **Sandbox yok**: eklenti kodu tam Node ayrıcalıklarıyla
591
+ çalışır; ESLint veya Vitest eklentileriyle aynı güven modeli. Bu
592
+ yüzden kod yürütme **her taramada opt-in**'dir: `--enable-plugins`
593
+ geçirin (veya `MJOLNIR_ENABLE_PLUGINS=1` ayarlayın), yoksa kaynaklar
594
+ YÜKLENMEZ — gürültülü bir stderr bildirimi atlananları tam olarak
595
+ listeler. Güvenilmeyen kodu taramak onu asla çalıştırmaz. JSON kural
596
+ bildirimleri (`mjolnir-rules/*.json`) etkilenmez: regex desenleri
597
+ bildirirler ve tasarımları gereği hiçbir kod çalıştırmazlar. Çekirdek
591
598
  kural kimliği önekleri rezerve edilmiştir ve kimlik taklidini önlemek
592
- için eklentilerden reddedilir.
599
+ için eklentilerden ve dış kurallardan reddedilir.
593
600
  - **Workspace-yerel dış kurallar** (klasör tabanlı, sıfır ağ) — tarama
594
601
  hedefinin yanındaki bir `mjolnir-rules/` dizini özel kurallar yükler:
595
602
  JSON dosyaları regex örüntüleri bildirir (kod yürütülmez),
package/README.uk.md CHANGED
@@ -15,7 +15,7 @@ CI-пайплайни, видає показник гідності й пока
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | Українська | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -296,14 +296,14 @@ macOS і Linux.
296
296
 
297
297
  ### Скільки з цього виміряно
298
298
 
299
- **74 з 99 правил несуть хибнопозитивну частоту, виміряну на реальному
299
+ **78 з 99 правил несуть хибнопозитивну частоту, виміряну на реальному
300
300
  OSS-коді** (по ≥ 10 вручну класифікованих знахідок на правило; див.
301
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Інші 19 виходять на оцінці
301
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Інші 21 виходять на оцінці
302
302
  автора. Футер кожного скана каже, скільки із _спрацьованих_ правил
303
303
  виміряно; `mjolnir rules --unmeasured` перелічує невиміряні; сторінка
304
304
  `mjolnir explain` кожного правила вказує її статус. Ми публікуємо
305
305
  частоту, навіть коли вона негарна — QA-CS-103 аудитується на 95 % і за
306
- це відправлено в карантин. Збільшувати ці 78 — постійна робота проєкту.
306
+ це відправлено в карантин. Збільшувати це число — постійна робота проєкту.
307
307
 
308
308
  ### Тіри правил і зрілість мов
309
309
 
@@ -452,14 +452,14 @@ FAILING declines an expired card (e2e/checkout.spec.ts)
452
452
  в дифі; воно не доводить, що система верифікації в цілому заслуговує
453
453
  довіри — і бачить лише показаний йому диф.
454
454
 
455
- | | AI-код-рев'ю (Copilot тощо) | **Mjölnir** |
456
- | ------------------------------------------------- | :------------------------------: | :-------------------------------: |
457
- | Ціна за скан | Токени (ростуть з розміром дифа) | **Нуль** (локально, встановлений) |
458
- | Бачить увесь с'ют + усі CI-конфіги | Лише PR-диф, показаний йому | **Все, щоразу** |
459
- | Детермінований (той самий вхід → той самий вихід) | ❌ (недетермінований) | **✅** |
460
- | Ловить патерни, що дрімають місяцями | Лише якщо в контексті | **✅** (сканує всі файли) |
461
- | Пам'ятає знахідки між запусками | ❌ (немає пам'яті між сесіями) | **✅** (baseline + diff) |
462
- | Запускається без людини | Потрібен PR чи промпт | **✅** (CI-хук, 3 секунди) |
455
+ | | AI-код-рев'ю (Copilot тощо) | **Mjölnir** |
456
+ | ------------------------------------------------- | :------------------------------: | :-------------------------------------: |
457
+ | Ціна за скан | Токени (ростуть з розміром дифа) | **Нуль** (локально, встановлений) |
458
+ | Бачить увесь с'ют + усі CI-конфіги | Лише PR-диф, показаний йому | **Все, щоразу** |
459
+ | Детермінований (той самий вхід → той самий вихід) | ❌ (недетермінований) | **✅** |
460
+ | Ловить патерни, що дрімають місяцями | Лише якщо в контексті | **✅** (сканує всі файли) |
461
+ | Пам'ятає знахідки між запусками | ❌ (немає пам'яті між сесіями) | **✅** (baseline + diff) |
462
+ | Запускається без людини | Потрібен PR чи промпт | **✅** (CI-хук, виконується за секунди) |
463
463
 
464
464
  **Використовуйте обидва.** AI ловить нюанс, задум і дизайнерські вади,
465
465
  яких не знайде жоден regex. Mjölnir ловить структурні патерни, які AI
@@ -582,11 +582,19 @@ JSON/SARIF-звіт — `schemaVersion: 1`. ID правил (`QA-<FAMILY>-NNN`)
582
582
  частотою хибних спрацювань з реального OSS-коду (див.
583
583
  [Скільки з цього виміряно](#скільки-з-цього-виміряно)); футер скана і
584
584
  `mjolnir rules --unmeasured` скажуть, які які.
585
- - **Довіра до плагінів** — плагіни — це npm-пакети, оголошені у
586
- `"plugins"`. **Пісочниці немає**: код плагіна працює з повними
585
+ - **Довіра до плагінів і ворота виконання** — плагіни — це npm-пакети,
586
+ оголошені у
587
+ `"plugins"`; JS-модулі живуть у `mjolnir-rules/*.mjs`.
588
+ **Пісочниці немає**: код плагіна працює з повними
587
589
  привілеями Node, та сама модель довіри, що в плагінів ESLint чи
588
- Vitest. Префікси ID основних правил зарезервовані й відкидаються від
589
- плагінів проти підміни.
590
+ Vitest. Саме тому виконання коду — **opt-in при кожному скані**:
591
+ передайте `--enable-plugins` (або задайте `MJOLNIR_ENABLE_PLUGINS=1`),
592
+ інакше джерела НЕ завантажуються — гучне повідомлення у stderr точно
593
+ перелічує пропущене. Сканування недовіреного коду ніколи його не
594
+ виконує. JSON-маніфести правил (`mjolnir-rules/*.json`) не зачеплені:
595
+ вони декларують regex-патерни й за конструкцією не виконують код.
596
+ Префікси ID основних правил зарезервовані й відкидаються від
597
+ плагінів і зовнішніх правил проти підміни.
590
598
  - **Workspace-локальні зовнішні правила** (фолдерні, нуль мережі) —
591
599
  каталог `mjolnir-rules/` поруч із ціллю скана завантажує власні
592
600
  правила: JSON-файли декларують regex-патерни (код не виконується),
package/README.vi.md CHANGED
@@ -15,7 +15,7 @@ niềm tin gãy.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | Tiếng Việt | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -292,14 +292,14 @@ Tổng cộng 20 quy tắc Python (QA-PY-001…012 vệ sinh pytest + QA-PY-101
292
292
 
293
293
  ### Bao nhiêu đã được đo
294
294
 
295
- **74 trong 99 quy tắc mang tỷ lệ false positive được đo trên mã OSS
295
+ **78 trong 99 quy tắc mang tỷ lệ false positive được đo trên mã OSS
296
296
  thật** (≥ 10 finding được phân loại tay mỗi quy tắc; xem
297
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). 19 quy tắc còn lại ra mắt trên
297
+ [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). 21 quy tắc còn lại ra mắt trên
298
298
  ước lượng của tác giả. Chân mỗi bản quét cho biết bao nhiêu quy tắc
299
299
  _đã bắn_ được đo; `mjolnir rules --unmeasured` liệt kê những quy tắc
300
300
  chưa đo; trang `mjolnir explain` của từng quy tắc nêu trạng thái. Chúng
301
301
  tôi công bố tỷ lệ kể cả khi nó xấu xí — QA-CS-103 kiểm toán ở mức 95 %
302
- và bị cách ly vì thế. Mở rộng con số 78 đó là công việc liên tục của
302
+ và bị cách ly vì thế. Mở rộng con số đó là công việc liên tục của
303
303
  dự án.
304
304
 
305
305
  ### Tier quy tắc và độ trưởng thành theo ngôn ngữ
@@ -448,14 +448,14 @@ Vấn đề khác, tầng khác. AI review có thể phát hiện thay đổi ki
448
448
  nghi ngờ trong diff; nó không chứng minh hệ thống kiểm chứng như một
449
449
  toàn thể đáng tin — và nó chỉ thấy diff bạn cho nó xem.
450
450
 
451
- | | AI code review (Copilot v.v.) | **Mjölnir** |
452
- | ----------------------------------- | :--------------------------------: | :-----------------------: |
453
- | Chi phí mỗi lần quét | Token (scale theo kích thước diff) | **Zero** (cục bộ, đã cài) |
454
- | Thấy cả suite + mọi cấu hình CI | Chỉ diff PR bạn cho xem | **Mọi thứ, mỗi lần** |
455
- | Tất định (cùng input → cùng output) | ❌ (không tất định) | **✅** |
456
- | Bắt mẫu nằm im hàng tháng | Chỉ khi có trong ngữ cảnh | **✅** (quét mọi file) |
457
- | Nhớ finding giữa các lần chạy | ❌ (không trí nhớ giữa các phiên) | **✅** (baseline + diff) |
458
- | Chạy không cần người kích hoạt | Cần PR hoặc prompt | **✅** (hook CI, 3 giây) |
451
+ | | AI code review (Copilot v.v.) | **Mjölnir** |
452
+ | ----------------------------------- | :--------------------------------: | :-----------------------------------: |
453
+ | Chi phí mỗi lần quét | Token (scale theo kích thước diff) | **Zero** (cục bộ, đã cài) |
454
+ | Thấy cả suite + mọi cấu hình CI | Chỉ diff PR bạn cho xem | **Mọi thứ, mỗi lần** |
455
+ | Tất định (cùng input → cùng output) | ❌ (không tất định) | **✅** |
456
+ | Bắt mẫu nằm im hàng tháng | Chỉ khi có trong ngữ cảnh | **✅** (quét mọi file) |
457
+ | Nhớ finding giữa các lần chạy | ❌ (không trí nhớ giữa các phiên) | **✅** (baseline + diff) |
458
+ | Chạy không cần người kích hoạt | Cần PR hoặc prompt | **✅** (hook CI, chạy trong vài giây) |
459
459
 
460
460
  **Dùng cả hai.** AI bắt được sắc thái, ý đồ và lỗi thiết kế không regex
461
461
  nào tìm ra. Mjölnir bắt các mẫu cấu trúc AI bỏ sót vì chúng trông
@@ -573,10 +573,17 @@ bất biến sau khi ra mắt và không bao giờ tái sử dụng.
573
573
  từ mã OSS thật mới ra tier tiêu đề (xem
574
574
  [Bao nhiêu đã được đo](#bao-nhiêu-đã-được-đo)); chân bản quét và
575
575
  `mjolnir rules --unmeasured` cho biết cái nào là cái nào.
576
- - **Niềm tin plugin** — plugin là gói npm khai báo trong `"plugins"`.
576
+ - **Niềm tin plugin và cổng thực thi** — plugin là gói npm khai báo trong
577
+ `"plugins"`; module JS nằm trong `mjolnir-rules/*.mjs`.
577
578
  **Không sandbox**: mã plugin chạy với đầy đủ đặc quyền Node, cùng mô
578
- hình tin cậy như plugin ESLint hay Vitest. Tiền tố rule ID core được
579
- bảo lưu và từ chối khỏi plugin để chống giả danh.
579
+ hình tin cậy như plugin ESLint hay Vitest. Vì vậy việc thực thi mã là
580
+ **opt-in trong mỗi lần quét**: truyền `--enable-plugins` (hoặc đặt
581
+ `MJOLNIR_ENABLE_PLUGINS=1`), nếu không nguồn sẽ KHÔNG được nạp — một
582
+ thông báo stderr rõ ràng liệt kê chính xác điều gì bị bỏ qua. Quét mã
583
+ không đáng tin cậy không bao giờ chạy nó. JSON rule manifest
584
+ (`mjolnir-rules/*.json`) không bị ảnh hưởng: khai báo regex pattern và
585
+ không thực thi mã theo thiết kế. Tiền tố rule ID core được
586
+ bảo lưu và từ chối khỏi plugin và quy tắc ngoài để chống giả danh.
580
587
  - **Quy tắc ngoài cục bộ theo workspace** (theo thư mục, 0 mạng) — một
581
588
  thư mục `mjolnir-rules/` cạnh đích quét nạp quy tắc riêng: file JSON
582
589
  khai báo mẫu regex (không chạy mã), module `.mjs`/`.js` export
package/README.zh.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  [English](README.md) | 简体中文 | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
16
16
 
17
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
17
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
18
 
19
19
  ```bash
20
20
  npx mjolnir-qa@latest
@@ -287,12 +287,12 @@ npx mjolnir-qa@latest --scope changed
287
287
 
288
288
  ### 这些规则中有多少经过测量
289
289
 
290
- **99 条规则中有 74 条携带在真实 OSS 代码上测得的假阳性率**(每条 ≥ 10 个
291
- 人工分类的发现;见 [docs/FP-AUDIT.md](docs/FP-AUDIT.md))。其余 19 条按
290
+ **99 条规则中有 78 条携带在真实 OSS 代码上测得的假阳性率**(每条 ≥ 10 个
291
+ 人工分类的发现;见 [docs/FP-AUDIT.md](docs/FP-AUDIT.md))。其余 21 条按
292
292
  作者的估计发布。每次扫描的页脚都会告诉你,_触发过的_ 规则中有多少经过
293
293
  测量;`mjolnir rules --unmeasured` 列出未测量的;每条规则的
294
294
  `mjolnir explain` 页面都声明其状态。即使数字难看我们也照样公布——
295
- QA-CS-103 的实测假阳性率是 95%,因此被隔离。把这个 78 扩大,是项目的
295
+ QA-CS-103 的实测假阳性率是 95%,因此被隔离。把这个数字扩大,是项目的
296
296
  持续性工作。
297
297
 
298
298
  ### 规则层级与语言成熟度
@@ -433,14 +433,14 @@ Linter 告诉你代码是否守规矩。Mjölnir 告诉你你的验证能不能
433
433
  问题不同、层面不同。AI 评审能在 diff 里发现可疑的测试改动;但它无法
434
434
  证明整个验证系统值得信任——而且它只看到你展示给它的 diff。
435
435
 
436
- | | AI 代码评审(Copilot 等) | **Mjölnir** |
437
- | ----------------------------- | :-----------------------: | :-----------------------: |
438
- | 每次扫描成本 | Token(随 diff 大小增长) | **零**(本地、已安装) |
439
- | 看到整个套件 + 所有 CI 配置 | 只有你展示的 PR diff | **每次都是全部** |
440
- | 确定性(相同输入 → 相同输出) | ❌(非确定性) | **✅** |
441
- | 抓出沉睡数月的模式 | 只在其进入上下文时 | **✅**(扫描所有文件) |
442
- | 跨运行记住发现 | ❌(会话间没有记忆) | **✅**(baseline + diff) |
443
- | 无人触发也能运行 | 需要 PR 或提示词 | **✅**(CI 钩子,3 秒) |
436
+ | | AI 代码评审(Copilot 等) | **Mjölnir** |
437
+ | ----------------------------- | :-----------------------: | :-------------------------------: |
438
+ | 每次扫描成本 | Token(随 diff 大小增长) | **零**(本地、已安装) |
439
+ | 看到整个套件 + 所有 CI 配置 | 只有你展示的 PR diff | **每次都是全部** |
440
+ | 确定性(相同输入 → 相同输出) | ❌(非确定性) | **✅** |
441
+ | 抓出沉睡数月的模式 | 只在其进入上下文时 | **✅**(扫描所有文件) |
442
+ | 跨运行记住发现 | ❌(会话间没有记忆) | **✅**(baseline + diff) |
443
+ | 无人触发也能运行 | 需要 PR 或提示词 | **✅**(CI 钩子,数秒内运行完成) |
444
444
 
445
445
  **两者都用。** AI 能捕捉任何正则都找不到的细微差别、意图与设计缺陷。
446
446
  Mjölnir 捕捉 AI 因其看起来「像是有意为之」而放过的结构模式——提交进
@@ -550,9 +550,15 @@ JSON/SARIF 报告为 `schemaVersion: 1`。规则 ID(`QA-<FAMILY>-NNN`)一经
550
550
  - **测量,而非断言**——只有具有来自真实 OSS 代码的假阳性率的规则才
551
551
  进入主打层级(见[这些规则中有多少经过测量](#这些规则中有多少经过测量));
552
552
  扫描页脚和 `mjolnir rules --unmeasured` 会告诉你哪条是哪条。
553
- - **插件信任**——插件是在 `"plugins"` 下声明的 npm 包。**没有沙箱**:
554
- 插件代码以完整 Node 特权运行,与 ESLint 或 Vitest 插件相同的信任
555
- 模型。核心规则 ID 前缀是保留的,插件若使用将被拒绝以防伪装。
553
+ - **插件信任与执行闸门**——插件是在 `"plugins"` 下声明的 npm 包;
554
+ JS 模块位于 `mjolnir-rules/*.mjs`。**没有沙箱**:插件代码以完整
555
+ Node 特权运行,与 ESLint 或 Vitest 插件相同的信任模型。正因如此,
556
+ 代码执行**在每次扫描时都是选择性的**:传入 `--enable-plugins`(或
557
+ 设置 `MJOLNIR_ENABLE_PLUGINS=1`),否则这些来源不会被加载——一条
558
+ 醒目的 stderr 提示会准确列出被跳过的内容。扫描不可信的代码绝不会
559
+ 执行它。JSON 规则清单(`mjolnir-rules/*.json`)不受影响:它们声明
560
+ 正则模式,按设计不执行任何代码。核心规则 ID 前缀是保留的,插件与
561
+ 外部规则若使用将被拒绝以防伪装。
556
562
  - **工作区本地外部规则**(基于文件夹、零网络)——扫描目标旁的
557
563
  `mjolnir-rules/` 目录可加载自定义规则:JSON 文件声明正则模式(不执行
558
564
  代码),`.mjs`/`.js` 模块导出 `rules`(完整 Node 信任,同插件)。外部
package/README.zht.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  [English](README.md) | [简体中文](README.zh.md) | 繁體中文 | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
16
16
 
17
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-04.
17
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
18
 
19
19
  ```bash
20
20
  npx mjolnir-qa@latest
@@ -287,12 +287,12 @@ npx mjolnir-qa@latest --scope changed
287
287
 
288
288
  ### 這些規則中有多少經過測量
289
289
 
290
- **99 條規則中有 74 條攜帶在真實 OSS 程式碼上測得的假陽性率**(每條 ≥ 10 個
291
- 人工分類的發現;見 [docs/FP-AUDIT.md](docs/FP-AUDIT.md))。其餘 19 條按
290
+ **99 條規則中有 78 條攜帶在真實 OSS 程式碼上測得的假陽性率**(每條 ≥ 10 個
291
+ 人工分類的發現;見 [docs/FP-AUDIT.md](docs/FP-AUDIT.md))。其餘 21 條按
292
292
  作者的估計發布。每次掃描的頁尾都會告訴你,_觸發過的_ 規則中有多少經過
293
293
  測量;`mjolnir rules --unmeasured` 列出未測量的;每條規則的
294
294
  `mjolnir explain` 頁面都聲明其狀態。即使數字難看我們也照樣公布——
295
- QA-CS-103 的實測假陽性率是 95%,因此被隔離。把這個 78 擴大,是專案的
295
+ QA-CS-103 的實測假陽性率是 95%,因此被隔離。把這個數字擴大,是專案的
296
296
  持續性工作。
297
297
 
298
298
  ### 規則層級與語言成熟度
@@ -433,14 +433,14 @@ Linter 告訴你程式碼是否守規矩。Mjölnir 告訴你你的驗證能不
433
433
  問題不同、層面不同。AI 審查能在 diff 裡發現可疑的測試改動;但它無法
434
434
  證明整個驗證系統值得信任——而且它只看到你展示給它的 diff。
435
435
 
436
- | | AI 程式碼審查(Copilot 等) | **Mjölnir** |
437
- | ----------------------------- | :-------------------------: | :-----------------------: |
438
- | 每次掃描成本 | Token(隨 diff 大小成長) | **零**(本機、已安裝) |
439
- | 看到整個套件 + 所有 CI 設定 | 只有你展示的 PR diff | **每次都是全部** |
440
- | 確定性(相同輸入 → 相同輸出) | ❌(非確定性) | **✅** |
441
- | 抓出沉睡數月的模式 | 只在其進入上下文時 | **✅**(掃描所有檔案) |
442
- | 跨執行記住發現 | ❌(工作階段之間沒有記憶) | **✅**(baseline + diff) |
443
- | 無人觸發也能執行 | 需要 PR 或提示詞 | **✅**(CI 掛鉤,3 秒) |
436
+ | | AI 程式碼審查(Copilot 等) | **Mjölnir** |
437
+ | ----------------------------- | :-------------------------: | :-------------------------------: |
438
+ | 每次掃描成本 | Token(隨 diff 大小成長) | **零**(本機、已安裝) |
439
+ | 看到整個套件 + 所有 CI 設定 | 只有你展示的 PR diff | **每次都是全部** |
440
+ | 確定性(相同輸入 → 相同輸出) | ❌(非確定性) | **✅** |
441
+ | 抓出沉睡數月的模式 | 只在其進入上下文時 | **✅**(掃描所有檔案) |
442
+ | 跨執行記住發現 | ❌(工作階段之間沒有記憶) | **✅**(baseline + diff) |
443
+ | 無人觸發也能執行 | 需要 PR 或提示詞 | **✅**(CI 掛鉤,數秒內執行完成) |
444
444
 
445
445
  **兩者都用。** AI 能捕捉任何正規表達式都找不到的細微差異、意圖與設計
446
446
  缺陷。Mjölnir 捕捉 AI 因其看起來「像是有意為之」而放過的結構模式——提交
@@ -550,9 +550,15 @@ JSON/SARIF 報告為 `schemaVersion: 1`。規則 ID(`QA-<FAMILY>-NNN`)一經
550
550
  - **測量,而非斷言**——只有具有來自真實 OSS 程式碼的假陽性率的規則才
551
551
  進入主打層級(見[這些規則中有多少經過測量](#這些規則中有多少經過測量));
552
552
  掃描頁尾與 `mjolnir rules --unmeasured` 會告訴你哪條是哪條。
553
- - **外掛信任**——外掛是在 `"plugins"` 下宣告的 npm 套件。**沒有沙箱**:
554
- 外掛程式碼以完整 Node 權限執行,與 ESLint 或 Vitest 外掛相同的信任
555
- 模型。核心規則 ID 前綴是保留的,外掛若使用將被拒絕以防偽冒。
553
+ - **外掛信任與執行閘門**——外掛是在 `"plugins"` 下宣告的 npm 套件;
554
+ JS 模組位於 `mjolnir-rules/*.mjs`。**沒有沙箱**:外掛程式碼以完整
555
+ Node 權限執行,與 ESLint 或 Vitest 外掛相同的信任模型。正因如此,
556
+ 程式碼執行**在每次掃描時都是選擇性的**:傳入 `--enable-plugins`(或
557
+ 設定 `MJOLNIR_ENABLE_PLUGINS=1`),否則這些來源不會被載入——一條
558
+ 醒目的 stderr 提示會準確列出被跳過的內容。掃描不可信的程式碼絕不會
559
+ 執行它。JSON 規則清單(`mjolnir-rules/*.json`)不受影響:它們宣告
560
+ 正規表示式模式,按設計不執行任何程式碼。核心規則 ID 前綴是保留的,
561
+ 外掛與外部規則若使用將被拒絕以防偽冒。
556
562
  - **工作區本機外部規則**(基於資料夾、零網路)——掃描目標旁的
557
563
  `mjolnir-rules/` 目錄可載入自訂規則:JSON 檔宣告正規表達式模式(不執行
558
564
  程式碼),`.mjs`/`.js` 模組匯出 `rules`(完整 Node 信任,同外掛)。外部
package/dist/cli.d.mts CHANGED
@@ -699,7 +699,7 @@ declare const runScan: typeof runScan$1, buildUniversalRules: typeof buildUniver
699
699
  * `scripts/sync-sarif-version.cjs` on release and guarded by
700
700
  * `tests/version-consistency.spec.ts` locally.
701
701
  */
702
- declare const CLI_VERSION = "0.5.11";
702
+ declare const CLI_VERSION = "0.5.13";
703
703
  /** A usage-error detail: the offending token, when one exists. */
704
704
  interface UsageErrorDetail {
705
705
  /** The unknown flag or rejected value (e.g. `--nope`, `loud`). */