mjolnir-qa 1.0.9 → 2.0.2
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 +204 -0
- package/README.ar.md +434 -478
- package/README.bn.md +434 -491
- package/README.br.md +434 -520
- package/README.bs.md +431 -500
- package/README.da.md +433 -509
- package/README.de.md +432 -522
- package/README.es.md +428 -517
- package/README.fr.md +426 -520
- package/README.gr.md +433 -517
- package/README.he.md +433 -475
- package/README.it.md +436 -525
- package/README.ja.md +436 -506
- package/README.ko.md +434 -494
- package/README.md +453 -438
- package/README.no.md +435 -509
- package/README.pl.md +433 -511
- package/README.ru.md +434 -515
- package/README.th.md +434 -484
- package/README.tr.md +427 -504
- package/README.uk.md +433 -505
- package/README.vi.md +436 -494
- package/README.zh.md +433 -462
- package/README.zht.md +433 -462
- package/dist/cli.d.mts +716 -110
- package/dist/cli.mjs +9815 -22027
- package/dist/mcp/stdio.mjs +2164 -886
- package/dist/rolldown-runtime-8H4AJuhK.mjs +14 -0
- package/dist/scan-pipeline-C0ka-RmX.mjs +2 -0
- package/dist/scan-pipeline-D3Yk2cef.mjs +15309 -0
- package/package.json +14 -8
package/README.tr.md
CHANGED
|
@@ -1,395 +1,431 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<img src="assets/readme/
|
|
3
|
+
<img src="assets/readme/hero.svg" alt="Mjölnir. Testler neyin geçtiğini söyler. Mjölnir neye güvenebileceğinizi söyler." width="100%" />
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
<br />
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
olarak nerede kırıldığını gösterir.
|
|
7
|
+
Mjölnir başarısız olamayan testleri ve kırmızıya dönemeyen pipeline'ları bulur,<br />
|
|
8
|
+
ardından sonuca ne kadar güvenilebileceğini, her puanın kanıtıyla birlikte puanlar.
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
[](https://github.com/Sergey-Bar/Mjolnir/actions/workflows/ci.yml)
|
|
13
|
-
[](LICENSE)
|
|
14
|
-
[](https://nodejs.org)
|
|
15
|
-
|
|
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)
|
|
10
|
+
<br />
|
|
17
11
|
|
|
18
|
-
|
|
12
|
+
[](https://www.npmjs.com/package/mjolnir-qa)
|
|
13
|
+
[](https://www.npmjs.com/package/mjolnir-qa)
|
|
14
|
+
[](https://github.com/Sergey-Bar/Mjolnir/actions/workflows/ci.yml)
|
|
15
|
+
[](https://codecov.io/gh/Sergey-Bar/Mjolnir)
|
|
16
|
+
[](https://scorecard.dev/viewer/?uri=github.com/Sergey-Bar/Mjolnir)
|
|
17
|
+
[](LICENSE)
|
|
18
|
+
[](https://nodejs.org)
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
npx mjolnir-qa@latest
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
[Çalışırken görün](#çalışırken-görün) · [Hızlı başlangıç](#hızlı-başlangıç) · [Neler bulur](#mjölnir-neler-bulur) · [Puan](#güvenilirlik-puanı) · [Kanıt](#kanıt-modeli) · [Çalıştırma analizi](#test-çalıştırma-analizi) · [CI](#ci-bütünlüğü) · [Ajanlar](#yapay-zekâ-ajanları) · [Güvenlik](#güven-ve-güvenlik) · [Sınırlar](#mjölnirin-size-söyleyemedikleri) · [Belgeler](#belgeler)
|
|
25
|
+
|
|
26
|
+
<details>
|
|
27
|
+
<summary>Başka bir dilde okuyun — 22 çeviri</summary>
|
|
28
|
+
|
|
29
|
+
[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)
|
|
25
30
|
|
|
26
|
-
[
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
[Belgelendirme](#-belgelendirme)
|
|
31
|
+
> 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-15.
|
|
32
|
+
|
|
33
|
+
<!-- Source hash: 3541b09e8d04 -->
|
|
34
|
+
|
|
35
|
+
</details>
|
|
32
36
|
|
|
33
37
|
</div>
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
<br />
|
|
40
|
+
|
|
41
|
+
## Yeşil onay işareti bir iddiadır, kanıt değil
|
|
42
|
+
|
|
43
|
+
Yeşil onay işareti pipeline'ın başarısız olmadığı anlamına gelir. Testlerin çalıştığı ya da başarısız olabilecekleri anlamına gelmez. Bunların her biri yeşil geçer:
|
|
44
|
+
|
|
45
|
+
- 900 yerine 3 test çalıştıran, commit edilmiş bir `.only`
|
|
46
|
+
- engellemesi gereken job üzerinde `continue-on-error: true`
|
|
47
|
+
- test komutundan sonra `|| true`
|
|
48
|
+
- hiçbir şeyi doğrulamayan ya da gövdesi boş olan bir test
|
|
49
|
+
- gerçek bir başarısızlığı şanslı bir geçişe çeviren bir retry sarmalayıcısı
|
|
50
|
+
- workflow'un yüklediği ama hiç üretmediği bir rapor
|
|
51
|
+
- bir yarış durumunu ayakta tutan sabit bir sleep
|
|
52
|
+
|
|
53
|
+
Hiçbiri pipeline'ı kırmızıya çevirmez ve her biri incelemede kasıtlı görünür. Bu yüzden hayatta kalırlar. İşte Mjölnir'in gerçek bir örneği okuması:
|
|
54
|
+
|
|
55
|
+
<p align="center">
|
|
56
|
+
<img src="assets/readme/scan.svg" alt="Demo deposunun CI workflow'u, satır satır okunmuş hâli. Mjölnir her bulguyu raporladığı satırda işaretler; kuralını, neyin yanlış olduğunu, kanıt düzeyini ve ölçülmüş yanlış pozitif oranını gösterir." width="800" />
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<sub>Demo taramasının bu workflow için raporladığı her bulgu, raporlandığı satırda. `npm run docs:readme-brand` ile [`demo-report.json`](assets/readme/demo-report.json) kaynağından üretilir ve CI'da sapmaya karşı kilitlenir.</sub>
|
|
60
|
+
|
|
61
|
+
**Katı mod.** En agresif tespitler — `.only`, `continue-on-error`, boş testler, tekrar kötüye kullanımı — karantina katında yaşar. Yalnızca `--strict` altında çalışır ve `info` şiddetindedir: işaretlerler, asla engellemezler. Varsayılan tarama (`--strict` olmayan `npx mjolnir-qa@latest`) yalnızca çekirdek ve genişletilmiş kuralları kapsar. Danışmanlık katmanını da istediğinizde `--strict` ekleyin.
|
|
62
|
+
|
|
63
|
+
Mjölnir test paketini, CI workflow'larını ve varsa gerçek bir çalıştırmanın raporunu okur. Testlerinizi çalıştırmaz, bağımlılıklarınızı kurmaz ve taradığı kodu yürütmez. Kanıtı olmadığında da güven uydurmak yerine bunu açıkça söyler:
|
|
64
|
+
|
|
65
|
+
| Durum | Mjölnir'in raporladığı |
|
|
66
|
+
| ---------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
67
|
+
| Test bildirimi bulunamadı | Puan `null`, **UNKNOWN** olarak gösterilir. Asla uydurma bir 100 değil. |
|
|
68
|
+
| Baseline ya da karşılaştırılabilir revizyon yok | **UNKNOWN**, nedeni belirtilerek. Asla varsayılmış bir 0 değil. |
|
|
69
|
+
| Tarama yarıda kesildi (zaman bütçesi, okunamayan dosyalar) | **PARTIAL**, çıkış `2`. Asla temiz olarak sunulmaz. |
|
|
70
|
+
|
|
71
|
+
<p align="center">
|
|
72
|
+
<img src="assets/readme/how-it-works.svg" alt="Mjölnir nasıl çalışır. Test paketini ve CI pipeline'ını statik olarak, varsa gerçek bir çalıştırmanın raporunu da okur. Her bulguyu kanıt düzeyine ve güven düzeyine göre ağırlıklandırır; L3 ile L5 arasına yalnızca gerçek bir çalıştırma ulaşabilir. Sonuç olarak bulgular, bir güvenilirlik puanı ve donmuş çıkış kodlarıyla bir CI kapısı üretir. Ajan döngüsünde yapay zekâ düzeltmeyi yazar, Mjölnir de kanıtlamak için yeniden tarar." width="880" />
|
|
73
|
+
</p>
|
|
74
|
+
|
|
75
|
+
<sub>Bu sayfa için tasarlandı ve 1:1 gösteriliyor. `npm run docs:readme-brand` ile üretilir ve CI'da sapmaya karşı kilitlenir; puan, sayılar ve kural kimliği [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) ve kural kaydından gelir, asla elle yazılmaz. Aynı görselin poster hâli: [`architecture.svg`](assets/readme/architecture.svg).</sub>
|
|
76
|
+
|
|
77
|
+
<br />
|
|
78
|
+
|
|
79
|
+
## Çalışırken görün
|
|
80
|
+
|
|
81
|
+
CI workflow'u olan küçük bir Playwright paketi olan [`examples/demo-repo`](examples/demo-repo) üzerinde gerçek bir tarama. Puanlarının nereye gittiği burada:
|
|
82
|
+
|
|
83
|
+
<p align="center">
|
|
84
|
+
<img src="assets/readme/terminal-hero.svg" alt="Mjölnir'in kesinti dökümü: WORTHINESS 80/100 WORTHY, kategoriye göre puan, önem derecesine göre kesinti kutusu ve bir FIX THIS FIRST listesi" width="520" />
|
|
85
|
+
</p>
|
|
86
|
+
|
|
87
|
+
<sub>`npm run docs:hero` ile gerçek bir taramadan üretilir ve CI'da sapmaya karşı kilitlenir. Aynı taramanın tam `--verbose` raporu [`demo.svg`](assets/readme/demo.svg) dosyasıdır (`npm run docs:demo`).</sub>
|
|
88
|
+
|
|
89
|
+
<details>
|
|
90
|
+
<summary><strong>İzleyin</strong> — bir tarama, yazdırdığı düzeltme ve bunu kanıtlayan yeniden tarama</summary>
|
|
36
91
|
|
|
37
|
-
|
|
92
|
+
<br />
|
|
38
93
|
|
|
39
94
|
<p align="center">
|
|
40
|
-
<
|
|
95
|
+
<a href="assets/video/mjolnir-demo.mp4">
|
|
96
|
+
<img src="assets/video/mjolnir-demo-poster.png" alt="Demo kaydından bir kare: npx mjolnir-qa@latest bir terminal penceresinde demo deposunu tarıyor" width="900" />
|
|
97
|
+
</a>
|
|
41
98
|
</p>
|
|
42
99
|
|
|
43
|
-
<sub>`
|
|
44
|
-
gerçek reporterdan render edildi — hiçbir şey kırpılmadı.
|
|
45
|
-
`npm run docs:demo` ile yeniden üretilir;
|
|
46
|
-
[`tests/demo-asset-reproducibility.spec.ts`](tests/demo-asset-reproducibility.spec.ts)
|
|
47
|
-
dosyası, çıktı aracın bastığından saptarsa CI'ı düşürür.</sub>
|
|
100
|
+
<sub>`npm run docs:video` ile gerçek bir taramadan kare kare işlendi; asla ekran kaydı alınmadı. [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4) dosyasını açmak için kareyi seçin.</sub>
|
|
48
101
|
|
|
49
|
-
|
|
102
|
+
</details>
|
|
50
103
|
|
|
51
|
-
|
|
52
|
-
workflow'unu ve bir Python test dosyasını keşfetti — dört
|
|
53
|
-
dil/format, tek geçiş.
|
|
54
|
-
2. Takımın güvenini zayıflatan kanıtlar buldu — bir işi maskeden
|
|
55
|
-
geçiren `continue-on-error`, bir exit kodunu yutan `|| true`, katı
|
|
56
|
-
sleep'ler, kırılgan bir seçici, sabitlenmiş staging URL'leri, bir
|
|
57
|
-
`networkidle` beklemesi.
|
|
58
|
-
3. Her birini kural kimliği, konum ve düzeltme içeren somut bir bulguya
|
|
59
|
-
— ve bir PR'ı gate'leyebileceğin tek bir puana dönüştürdü.
|
|
104
|
+
### Tek bir bulguya yakından bakış
|
|
60
105
|
|
|
61
|
-
|
|
106
|
+
Her bulgu dört soruyu yanıtlar: nerede olduğu, Mjölnir'in ne kadar emin olduğu, kuralın ne sıklıkla yanıldığı ve nasıl düzeltileceği.
|
|
62
107
|
|
|
63
|
-
|
|
64
|
-
|
|
108
|
+
<p align="center">
|
|
109
|
+
<img src="assets/readme/finding-anatomy.svg" alt="Demo taramasının ilk bulgusu, terminalin yazdırdığı hâliyle birebir, dört bölümü işaretlenmiş olarak: nerede, ne kadar emin, kural ne sıklıkla yanılıyor ve düzeltme." width="100%" />
|
|
110
|
+
</p>
|
|
111
|
+
|
|
112
|
+
`mjolnir explain QA-CI-001` bir kuralın tüm güven kaydını yazdırır; ölçülmüş yanlış pozitif oranı ve bu oranın ona kazandırdığı düzey de dahil:
|
|
65
113
|
|
|
66
114
|
```text
|
|
67
|
-
|
|
115
|
+
▍ QA-CI-001 — continue-on-error masks a failing verification gate
|
|
68
116
|
|
|
69
117
|
Severity: error
|
|
70
118
|
Confidence: high
|
|
119
|
+
Tier: quarantine
|
|
71
120
|
Evidence: E2
|
|
72
|
-
|
|
121
|
+
QA impact: False-green risk (FALSE-GREEN)
|
|
122
|
+
Measured FP: 11% (19 hand-classified corpus verdicts)
|
|
123
|
+
FP risk: low (author estimate)
|
|
124
|
+
Languages: yaml
|
|
125
|
+
Frameworks: github-actions, azure-pipelines
|
|
73
126
|
|
|
74
127
|
WHAT WAS FOUND (real detector output, not a mockup)
|
|
75
128
|
Job `security-scan` runs a verification gate under `continue-on-error: true`.
|
|
76
129
|
|
|
77
130
|
WHY IT MATTERS
|
|
78
|
-
This job can fail every day and CI will still show green. The checkmark
|
|
79
|
-
|
|
131
|
+
This job can fail every day and CI will still show green. The checkmark on
|
|
132
|
+
this workflow cannot be trusted.
|
|
80
133
|
|
|
81
134
|
HOW TO FIX
|
|
82
135
|
Remove continue-on-error, or scope it to individual non-blocking steps only.
|
|
83
|
-
```
|
|
84
136
|
|
|
85
|
-
|
|
86
|
-
söylediği — oysa geçmediği — bir yer.
|
|
137
|
+
Example from this rule's own must-fire fixture: QA-CI-001/must-fire/masked.yml
|
|
87
138
|
|
|
88
|
-
|
|
139
|
+
WHAT WOULD CHANGE THE VERDICT
|
|
140
|
+
- a run report next to the scan target (mjolnir.report.json or test-results/)
|
|
141
|
+
corroborating this file lifts its findings to L3–L5
|
|
142
|
+
- a documented suppression (mjolnir.config.json) lowers the finding count
|
|
143
|
+
without claiming correctness
|
|
144
|
+
- quarantine findings run only under --strict and are advisory (E0) — they can
|
|
145
|
+
never gate CI
|
|
89
146
|
|
|
90
|
-
|
|
147
|
+
NEXT ACTION
|
|
148
|
+
Fix the first occurrence, then re-run: `mjolnir --scope changed`. Every
|
|
149
|
+
occurrence of this rule is listed in the scan output.
|
|
91
150
|
|
|
92
|
-
|
|
151
|
+
HOW TO VERIFY THE FIX
|
|
152
|
+
Re-run `mjolnir` on the changed file(s) — this finding should no longer
|
|
153
|
+
appear. `mjolnir --scope changed` scopes the check to just what you touched.
|
|
93
154
|
|
|
94
|
-
|
|
95
|
-
npx mjolnir-qa@latest
|
|
155
|
+
Docs: mjolnir rules --md (full catalog, this rule included)
|
|
96
156
|
```
|
|
97
157
|
|
|
98
|
-
|
|
99
|
-
|
|
158
|
+
Değer birimi budur: CI'ın hak etmediği bir geçişi raporladığı tek bir yer.
|
|
159
|
+
|
|
160
|
+
<br />
|
|
161
|
+
|
|
162
|
+
## Hızlı başlangıç
|
|
100
163
|
|
|
101
164
|
```bash
|
|
102
|
-
npx mjolnir-qa@latest
|
|
165
|
+
npx mjolnir-qa@latest
|
|
103
166
|
```
|
|
104
167
|
|
|
105
|
-
|
|
106
|
-
ve bitti. Gerisi opsiyoneldir.
|
|
107
|
-
|
|
108
|
-
| Komut | Ne yapar |
|
|
109
|
-
| ----------------------------------- | ------------------------------------------------------------------- |
|
|
110
|
-
| `mjolnir` | Tüm repo taraması + güvenilirlik puanı |
|
|
111
|
-
| `mjolnir --scope changed` | Yalnızca branch'inin getirdikleri — CI biçimi |
|
|
112
|
-
| `mjolnir ci install` | Danışmanlık PR workflow'unu üretir |
|
|
113
|
-
| `mjolnir explain QA-CI-001` | Ne / neden / düzeltme + bir kural için ölçülmüş FP oranı |
|
|
114
|
-
| `mjolnir rules --unmeasured` | Ölçümle değil varsayımla çalışan kurallar |
|
|
115
|
-
| `mjolnir --json` / `--format sarif` | Makine okunur / GitHub Code Scanning |
|
|
116
|
-
| `mjolnir --strict` | Quarantine katmanı kurallarını da çalıştırır (daha yüksek FP riski) |
|
|
168
|
+
Geçerli dizini tarar ve Trust Report'u yazdırır: ne bulduğunu, ne kadar güvenebileceğinizi, nedenini ve sırada ne yapmanız gerektiğini. Kapı düzeyinde ya da üstünde hiçbir şey bulunmazsa `0` ile çıkar.
|
|
117
169
|
|
|
118
|
-
|
|
119
|
-
<summary><strong>Bir şey flaky olduğunda</strong></summary>
|
|
170
|
+
CI'da yalnızca dalın getirdiklerini tarayın; böylece eski bir test paketi ilk pull request'inizi boğmaz:
|
|
120
171
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
| `mjolnir triage ./test-results/` | Yürütme geçmişinden karantina önerisi |
|
|
125
|
-
| `mjolnir pw-report ./test-results/` | Playwright çalıştırma özeti — retry / flake / en yavaşlar |
|
|
126
|
-
| `mjolnir doctor:playwright` | Yalnızca Playwright derin tarama + Selector Health Score |
|
|
172
|
+
```bash
|
|
173
|
+
npx mjolnir-qa@latest --scope changed
|
|
174
|
+
```
|
|
127
175
|
|
|
128
|
-
|
|
176
|
+
`mjolnir ci install` bunu, ana `v1` etiketine sabitlenmiş [action](https://github.com/Sergey-Bar/Mjolnir#readme) ile bir GitHub Actions workflow'u olarak yazar (ya da `--no-action` ile düz `npx`). Siz engellemesi gerektiğine karar verene kadar tavsiye niteliğinde kalır.
|
|
177
|
+
|
|
178
|
+
| Komut | Ne yapar |
|
|
179
|
+
| ----------------------------------- | --------------------------------------------------------------------- |
|
|
180
|
+
| `mjolnir` | Trust Report: karar, güven düzeyi, sonraki adım |
|
|
181
|
+
| `mjolnir --scope changed` | Yalnızca dalınızın getirdikleri (CI biçimi) |
|
|
182
|
+
| `mjolnir ci install` | Tavsiye niteliğindeki PR workflow'unu üretir (action tabanlı) |
|
|
183
|
+
| `mjolnir explain QA-CI-001` | Ne, neden ve düzeltme; ayrıca ölçülmüş FP oranı |
|
|
184
|
+
| `mjolnir why src/a.spec.ts:42` | Tam olarak bu satırın neden işaretlendiği. Asla engellemez. |
|
|
185
|
+
| `mjolnir forensics ./test-results/` | Gerçek bir çalıştırmadan çalışma zamanı kanıtı |
|
|
186
|
+
| `mjolnir trust-report` | Kendi içinde bütün Trust Artifact (md + json) |
|
|
187
|
+
| `mjolnir handoff` | Kodlama ajanı için iyileştirme planı |
|
|
188
|
+
| `mjolnir --json` / `--format sarif` | Makine tarafından okunabilir çıktı, GitHub Code Scanning |
|
|
189
|
+
| `mjolnir --format codequality` | GitLab Code Quality raporu (MR widget'ı artefaktı) |
|
|
190
|
+
| `mjolnir --strict` | quarantine düzeyindeki kuralları da çalıştırır (daha yüksek FP riski) |
|
|
129
191
|
|
|
130
192
|
<details>
|
|
131
|
-
<summary><strong>
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
| `mjolnir
|
|
138
|
-
| `mjolnir
|
|
139
|
-
| `mjolnir
|
|
140
|
-
| `mjolnir
|
|
141
|
-
| `mjolnir
|
|
142
|
-
| `mjolnir
|
|
143
|
-
| `mjolnir
|
|
144
|
-
| `mjolnir
|
|
145
|
-
| `mjolnir
|
|
193
|
+
<summary><strong>Diğer tüm komutlar</strong> — kararsız test triyajı, raporlama, yönetişim</summary>
|
|
194
|
+
|
|
195
|
+
<br />
|
|
196
|
+
|
|
197
|
+
| Komut | Ne yapar |
|
|
198
|
+
| ----------------------------------- | ----------------------------------------------------------------------------------- |
|
|
199
|
+
| `mjolnir --classic` | Trust Report öncesi puan başlığı görünümü |
|
|
200
|
+
| `mjolnir explain verdict` | Kaydedilmiş taramanın kararının neden öyle olduğu |
|
|
201
|
+
| `mjolnir triage ./test-results/` | Rehberli triyaj. Her satır bir sonraki adımla biter. |
|
|
202
|
+
| `mjolnir pw-report ./test-results/` | Playwright çalıştırma özeti: yeniden denemeler, kararsız testler, en yavaşlar |
|
|
203
|
+
| `mjolnir doctor:playwright` | Yalnızca Playwright için derin tarama ve Selector Health Score |
|
|
204
|
+
| `mjolnir fix --dry-run` / `fix` | Güvenli otomatik düzeltmeler; her biri tuttuğunu kanıtlamak için yeniden taranır |
|
|
205
|
+
| `mjolnir baseline` / `diff` | Bulguların anlık görüntüsünü alır, sonra yalnızca yeni ya da kötüleşenleri raporlar |
|
|
206
|
+
| `mjolnir impact --since <ref>` | Bir commit'in getirdikleri ve çözdükleri |
|
|
207
|
+
| `mjolnir summary` | Bir rapordan CI açıklamaları ve step özeti |
|
|
208
|
+
| `mjolnir pr-comment` | Kapsamı sınırlı bir PR yorumu, Markdown olarak |
|
|
209
|
+
| `mjolnir debt` | Maliyet modelli test borcu kaydı |
|
|
210
|
+
| `mjolnir handover` | Yeni bir QA mühendisi için paketin tanıtım haritası |
|
|
211
|
+
| `mjolnir init` | Framework'leri algılar, bir kurulum kontrol listesi yazdırır |
|
|
212
|
+
| `mjolnir suppressions` | Bastırılmış bulguları listeler, yönetişim için |
|
|
213
|
+
| `mjolnir rules --unmeasured` | Ölçüme değil varsayıma dayanarak çalışan kurallar |
|
|
214
|
+
| `mjolnir rules --md` | Tam kural kataloğu (JSON veya Markdown) |
|
|
215
|
+
| `mjolnir doctor` | Mjölnir'in kendi kural tabanının öz denetimi |
|
|
216
|
+
| `mjolnir create-rule <ID>` | Yeni bir kural ve fixture'ları için iskelet oluşturur |
|
|
217
|
+
| `mjolnir stats` | Görülen düzeltmelerin yerel, tüm zamanlar sayaçları |
|
|
218
|
+
| `mjolnir badge` | shields.io uç noktası JSON'u ve kod parçası |
|
|
219
|
+
| `mjolnir --cache` | Yerel bir karar önbelleğiyle artımlı yeniden taramalar |
|
|
220
|
+
| `mjolnir --format mermaid` | PR yorumu için test mimarisi diyagramı |
|
|
221
|
+
|
|
222
|
+
`mjolnir help <command>` her biri için kullanım, örnekler ve sonraki adımı yazdırır.
|
|
146
223
|
|
|
147
224
|
</details>
|
|
148
225
|
|
|
149
|
-
|
|
150
|
-
Node.js ≥ 22.18 gerekir. Windows, macOS ve Linux'ta çalışır.
|
|
151
|
-
|
|
152
|
-
---
|
|
226
|
+
Windows, macOS veya Linux üzerinde **Node.js ≥ 22.18** gerektirir. Global kurulumu mu tercih edersiniz? `npm i -g mjolnir-qa`. Bu alt sınır derleme araç zincirinden gelir (tsdown onu hedefler ve sürüm pipeline'ı ona karşı duman testi yapar); çalışma zamanı bağımlılıkları bundan fazlasını gerektirmez.
|
|
153
227
|
|
|
154
|
-
|
|
228
|
+
<br />
|
|
155
229
|
|
|
156
|
-
|
|
157
|
-
yeşil onayın gerçekten hak edildiğine dair kanıt gerektiren kişiler.
|
|
158
|
-
- **Platform / DevEx ekipleri** — CI bütünlüğünden ve release
|
|
159
|
-
kapılarından sorumlu; bir `continue-on-error`'ın kırmızı hattı sessizce
|
|
160
|
-
yeşile boyamasını istemeyenler.
|
|
161
|
-
- **OSS bakıcıları** — yerel ve CI'da, sıfır ağ çağrısıyla çalışan ucuz,
|
|
162
|
-
her zaman açık bir doğrulama kapısı isteyenler.
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## 🔨 Mjölnir neleri kontrol eder
|
|
167
|
-
|
|
168
|
-
| | |
|
|
169
|
-
| --- | ------------------------------------------------------------------------------------------------------------------------------- |
|
|
170
|
-
| ⚖️ | **Güvenilirlik puanı** — tek sayı, şeffaf kesinti tablosu, kara kutu yok |
|
|
171
|
-
| 🎭 | **Selector Health Score** — yalnızca geçiş oranınızı değil, Playwright locator'larınızı not eder |
|
|
172
|
-
| 🔬 | **Çalışma zamanı adli analizi** — gerçek Playwright/JUnit verilerini okur ve `TRUE-FLAKE` yakalar, yalnızca statik tahmin değil |
|
|
173
|
-
| 🚨 | **CI bütünlüğü kuralları** — `continue-on-error`, `\|\| true` ve diğer yanlış-yeşil hilelerini yakalar |
|
|
174
|
-
| 🐍 | **Dört Playwright bağlamasının hepsi** — TypeScript, Python, Java, C#/.NET — artı pytest, JUnit/TestNG ve CI workflow'ları |
|
|
175
|
-
| 🔒 | **Local-first** — tarama sırasında sıfır ağ çağrısı, sıfır telemetri, saniyeler içinde çalışır |
|
|
176
|
-
|
|
177
|
-
### Kurallar
|
|
178
|
-
|
|
179
|
-
Her kural, must-fire **ve** must-not-fire fixture'larıyla gelir.
|
|
180
|
-
Kendi negatif fixture'ında tetiklenen bir kural sevk edilemez — bu,
|
|
181
|
-
yanlış pozitif duvarıdır.
|
|
182
|
-
|
|
183
|
-
<details>
|
|
184
|
-
<summary><strong>Test hijyeni</strong></summary>
|
|
185
|
-
|
|
186
|
-
| ID | Kural | Severity |
|
|
187
|
-
| ----------- | --------------------------------------------------- | -------- |
|
|
188
|
-
| QA-TEST-001 | Commit edilmiş odaklı test (`.only`, `fit`) | error |
|
|
189
|
-
| QA-TEST-002 | Gerekçesiz atlanan test | error |
|
|
190
|
-
| QA-TEST-002 | Kayıtlı gerekçeyle atlanan test | warning |
|
|
191
|
-
| QA-TEST-003 | Assertion içermeyen test | error |
|
|
192
|
-
| QA-TEST-004 | Katı sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning |
|
|
193
|
-
| QA-TEST-006 | Flakiness'i gizleyen retry istismarı | warning |
|
|
194
|
-
| QA-TEST-010 | Boş test gövdesi | error |
|
|
230
|
+
## Mjölnir neler bulur
|
|
195
231
|
|
|
196
|
-
|
|
232
|
+
<p align="center">
|
|
233
|
+
<img src="assets/readme/stack.svg" alt="Yığınınızla çalışır: kurallarının kapsadığı diller, test framework'leri ve CI sistemleri, kural kaydından." width="100%" />
|
|
234
|
+
</p>
|
|
197
235
|
|
|
198
|
-
|
|
199
|
-
<summary><strong>Test kalitesi</strong></summary>
|
|
236
|
+
Dört ailede **79 kural** — test hijyeni, test kalitesi, Playwright ve CI bütünlüğü — TypeScript ve JavaScript, Python, Java, C# ve GitHub Actions YAML genelinde. Playwright'ı dört bağlamasının tamamında, ayrıca pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest ve Mocha'yı kapsarlar; Cypress ve Selenium için başlangıç düzeyinde kapsam vardır. Biçimi göstermek için dokuzu:
|
|
200
237
|
|
|
201
|
-
| ID | Kural
|
|
202
|
-
| ------------ |
|
|
203
|
-
| QA-
|
|
204
|
-
| QA-
|
|
205
|
-
| QA-
|
|
238
|
+
| ID | Kural | Önem | Düzey |
|
|
239
|
+
| ------------ | -------------------------------------------------------------------- | ------- | ---------- |
|
|
240
|
+
| QA-CI-001 | `continue-on-error` başarısız bir doğrulama kapısını maskeler | error | quarantine |
|
|
241
|
+
| QA-CI-009 | Test çıkış kodu aktarılmıyor (pipefail olmadan `\|`, `;` zincirleri) | error | extended |
|
|
242
|
+
| QA-TEST-001 | Odaklanmış test commit edildi (`.only`, `fit`) | error | quarantine |
|
|
243
|
+
| QA-TEST-003 | Doğrulamasız test | error | quarantine |
|
|
244
|
+
| QA-TQUAL-009 | await edilmemiş promise doğrulaması | error | quarantine |
|
|
245
|
+
| QA-PW-002 | await edilmemiş locator doğrulaması | error | core |
|
|
246
|
+
| QA-PW-004 | Kırılgan CSS/XPath seçicileri | warning | quarantine |
|
|
247
|
+
| QA-PY-002 | Atlanan test (`skip`, katı olmayan `xfail`) | warning | core |
|
|
248
|
+
| QA-CS-103 | Doğrulamasız test metodu | error | core |
|
|
206
249
|
|
|
207
|
-
|
|
250
|
+
Tam katalog kayıttan üretilir, asla elle tutulmaz: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) ya da [neleri denetlediği rehberi](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
|
|
208
251
|
|
|
209
252
|
<details>
|
|
210
|
-
<summary><strong>
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
|
217
|
-
|
|
|
253
|
+
<summary><strong>Bu README'de adı geçen tüm kurallar</strong>, tek bir tabloda</summary>
|
|
254
|
+
|
|
255
|
+
<br />
|
|
256
|
+
|
|
257
|
+
> `quarantine` kuralları yalnızca `--strict` altında çalışır ve asla engellemez (info düzeyiyle sınırlıdır). Gösterilen önem, yazarın belirlediği önemdir.
|
|
258
|
+
|
|
259
|
+
| ID | Aile | Kural | Önem | Düzey |
|
|
260
|
+
| ------------ | ---------- | -------------------------------------------------------------------- | ------- | ---------- |
|
|
261
|
+
| QA-TEST-001 | Hijyen | Odaklanmış test commit edildi (`.only`, `fit`) | error | quarantine |
|
|
262
|
+
| QA-TEST-002 | Hijyen | Atlanan test. İzlenen bir gerekçe olmadan `error` düzeyine yükselir. | warning | quarantine |
|
|
263
|
+
| QA-TEST-003 | Hijyen | Doğrulamasız test | error | quarantine |
|
|
264
|
+
| QA-TEST-004 | Hijyen | Sabit sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
|
|
265
|
+
| QA-TEST-006 | Hijyen | Kararsızlığı gizleyen retry kötüye kullanımı | warning | quarantine |
|
|
266
|
+
| QA-TEST-010 | Hijyen | Boş test gövdesi | error | quarantine |
|
|
267
|
+
| QA-TQUAL-002 | Kalite | Totolojik doğrulama | error | quarantine |
|
|
268
|
+
| QA-TQUAL-009 | Kalite | await edilmemiş promise doğrulaması | error | quarantine |
|
|
269
|
+
| QA-TQUAL-011 | Kalite | Yorum satırına alınmış testler | warning | extended |
|
|
270
|
+
| QA-PW-002 | Playwright | await edilmemiş locator doğrulaması | error | core |
|
|
271
|
+
| QA-PW-003 | Playwright | `page.pause()` / `test.only()` commit edildi | error | core |
|
|
272
|
+
| QA-PW-004 | Playwright | Kırılgan CSS/XPath seçicileri | warning | quarantine |
|
|
273
|
+
| QA-PW-123 | Playwright | Koda gömülü ortam URL'leri | warning | quarantine |
|
|
274
|
+
| QA-PW-140 | Playwright | `maxDiffPixelRatio` olmadan ekran görüntüsü | warning | core |
|
|
275
|
+
| QA-CI-001 | CI | `continue-on-error` başarısız bir kapıyı maskeler | error | quarantine |
|
|
276
|
+
| QA-CI-002 | CI | `\|\| true` çıkış kodlarını yutar | error | extended |
|
|
277
|
+
| QA-CI-005 | CI | Rapor kullanılıyor ama hiç üretilmiyor | error | quarantine |
|
|
278
|
+
| QA-CI-007 | CI | Testlerin etrafında retry sarmalayıcıları | warning | extended |
|
|
279
|
+
| QA-CI-008 | CI | Her zaman başarılı olan step hataları maskeler | error | quarantine |
|
|
280
|
+
| QA-CI-009 | CI | Çıkış kodu aktarılmıyor (pipefail olmadan `\|`, `;` zincirleri) | error | extended |
|
|
281
|
+
| QA-CI-010 | CI | Engellemeleri gereken yerde atlanan testler | error | quarantine |
|
|
282
|
+
| QA-PY-002 | Python | Atlanan test (`skip`, katı olmayan `xfail`) | warning | core |
|
|
283
|
+
| QA-PY-003 | Python | Doğrulamasız test fonksiyonu | error | quarantine |
|
|
284
|
+
| QA-PY-005 | Python | Testlerde `time.sleep()` | warning | extended |
|
|
285
|
+
| QA-PY-012 | Python | Totolojik doğrulama | error | quarantine |
|
|
286
|
+
| QA-JV-101 | Java | Devre dışı bırakılmış test (`@Disabled`) | warning | core |
|
|
287
|
+
| QA-JV-102 | Java | Sabit sleep (`Thread.sleep()`) | warning | extended |
|
|
288
|
+
| QA-JV-103 | Java | Doğrulamasız test metodu | error | extended |
|
|
289
|
+
| QA-JV-105 | Java | Playwright `waitForTimeout()` ile sabit sleep | warning | core |
|
|
290
|
+
| QA-JV-106 | Java | Rol tabanlı locator yerine kırılgan seçici | warning | quarantine |
|
|
291
|
+
| QA-CS-101 | C# | Atlanan test (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
|
|
292
|
+
| QA-CS-102 | C# | Sabit sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
|
|
293
|
+
| QA-CS-103 | C# | Doğrulamasız test metodu | error | core |
|
|
294
|
+
| QA-CS-105 | C# | `WaitForTimeoutAsync()` ile sabit sleep | warning | extended |
|
|
295
|
+
| QA-CS-106 | C# | Rol tabanlı locator yerine kırılgan seçici | warning | quarantine |
|
|
296
|
+
|
|
297
|
+
Python ayrıca QA-PY-001…012 (pytest hijyeni) ve QA-PY-101…108 (Python için Playwright) ile gelir. Cypress ve Selenium'un üçer kurallık başlangıç setleri vardır.
|
|
218
298
|
|
|
219
299
|
</details>
|
|
220
300
|
|
|
221
|
-
|
|
222
|
-
<summary><strong>CI bütünlüğü</strong></summary>
|
|
223
|
-
|
|
224
|
-
| ID | Kural | Severity |
|
|
225
|
-
| --------- | --------------------------------------------------------------------- | -------- |
|
|
226
|
-
| QA-CI-001 | `continue-on-error` başarısızlıkları maskeler | error |
|
|
227
|
-
| QA-CI-002 | `\|\| true` exit kodlarını yutar | error |
|
|
228
|
-
| QA-CI-005 | Rapor tüketilir ama asla üretilmez | error |
|
|
229
|
-
| QA-CI-007 | Testleri saran retry sarmalayıcıları | warning |
|
|
230
|
-
| QA-CI-008 | Hepsi-başarılı adım başarısızlıkları maskeler | error |
|
|
231
|
-
| QA-CI-009 | Test exit kodu iletilmez (`\|` pipefail'sız, `;` zincirleri) | error |
|
|
232
|
-
| QA-CI-010 | Testler, bloklaması gereken yerlerde atlanıyor (skip-on-PR bekçileri) | error |
|
|
301
|
+
Her kural bir must-fire **ve** bir must-not-fire fixture'ı ile yayımlanır ve kendi negatif fixture'ında tetiklenen bir kural yayımlanamaz. Bu, yanlış pozitif güvenlik duvarıdır; `mjolnir doctor` bunu bu deponun kendi CI'ında uygular.
|
|
233
302
|
|
|
234
|
-
|
|
303
|
+
### Selector Health Score
|
|
235
304
|
|
|
236
|
-
|
|
237
|
-
<summary><strong>Python / pytest 🐍</strong></summary>
|
|
238
|
-
|
|
239
|
-
| ID | Kural | Severity |
|
|
240
|
-
| --------- | ------------------------------------------- | -------- |
|
|
241
|
-
| QA-PY-002 | Atlanan test (`skip`, katı olmayan `xfail`) | warning |
|
|
242
|
-
| QA-PY-003 | Assertion içermeyen test fonksiyonu | error |
|
|
243
|
-
| QA-PY-005 | Testlerde `time.sleep()` | warning |
|
|
244
|
-
| QA-PY-012 | Totolojik assertion | error |
|
|
305
|
+
`mjolnir doctor:playwright` her locator'ı bir öğeyi nasıl bulduğuna göre derecelendirir: bir kullanıcının yapacağı gibi (rol, etiket, metin), açık bir sözleşmeyle (`data-testid`) ya da yapısal bir tesadüfle (CSS zincirleri, XPath). Her dosya 0 ile 100 arasında bir puan alır:
|
|
245
306
|
|
|
246
|
-
|
|
307
|
+
```text
|
|
308
|
+
▍ SELECTOR HEALTH
|
|
247
309
|
|
|
248
|
-
|
|
310
|
+
e2e/login.spec.ts
|
|
311
|
+
[█████████████░░░░░░░] 65 / 100
|
|
312
|
+
role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
|
|
249
313
|
|
|
250
|
-
|
|
251
|
-
|
|
314
|
+
e2e/checkout.spec.ts
|
|
315
|
+
[██████████████████░░] 88 / 100
|
|
316
|
+
role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
|
|
317
|
+
```
|
|
252
318
|
|
|
253
|
-
|
|
254
|
-
| --------- | ---------------------------------------- | -------- |
|
|
255
|
-
| QA-JV-101 | Devre dışı test (`@Disabled`) | warning |
|
|
256
|
-
| QA-JV-102 | Katı sleep (`Thread.sleep()`) | warning |
|
|
257
|
-
| QA-JV-103 | Assertion içermeyen test yöntemi | error |
|
|
258
|
-
| QA-JV-105 | Playwright katı sleep `waitForTimeout()` | warning |
|
|
259
|
-
| QA-JV-106 | Role locator yerine kırılgan seçici | warning |
|
|
319
|
+
Bu, **doğruluğu değil dayanıklılığı** ölçer. `.btn.btn-primary > div:nth-child(2)` bugün geçer ve biri işaretlemeye dokunana kadar geçmeye devam eder. Düşük bir puan asla testin bozuk olduğunu iddia etmez; yalnızca kimsenin korumayı vaat etmediği işaretlemeye bağlı olduğunu söyler.
|
|
260
320
|
|
|
261
|
-
|
|
321
|
+
<br />
|
|
262
322
|
|
|
263
|
-
|
|
264
|
-
<summary><strong>C# / .NET — NUnit · xUnit · MSTest 🟣</strong></summary>
|
|
323
|
+
## Güvenilirlik puanı
|
|
265
324
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
| QA-CS-102 | Katı sleep (`Thread.Sleep` / `Task.Delay`) | warning |
|
|
270
|
-
| QA-CS-103 | Assertion içermeyen test yöntemi | error |
|
|
271
|
-
| QA-CS-105 | Katı sleep `WaitForTimeoutAsync()` | warning |
|
|
272
|
-
| QA-CS-106 | Role locator yerine kırılgan seçici | warning |
|
|
325
|
+
<p align="center">
|
|
326
|
+
<img src="assets/readme/score-gauge.svg" alt="0'dan 100'e güvenilirlik ölçeği, her puanı dolaşan bir işaretçiyle: 50'nin altı UNWORTHY, 50–79 NEEDS WORK, 80–99 WORTHY, 100 FORGED" width="720" />
|
|
327
|
+
</p>
|
|
273
328
|
|
|
274
|
-
|
|
329
|
+
<sub>0'dan 100'e her puan, gerçek `deriveScoreState` tarafından yerleştirildi. `npm run docs:gauge` ile üretilir ve CI'da sapmaya karşı kilitlenir.</sub>
|
|
275
330
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
> Kural başına sayfalar [`docs/rules/`](docs/rules/) altındadır.
|
|
331
|
+
| Puan | Karar |
|
|
332
|
+
| --------- | -------------------------------------- |
|
|
333
|
+
| `0 – 49` | **UNWORTHY** |
|
|
334
|
+
| `50 – 79` | **NEEDS WORK** |
|
|
335
|
+
| `80 – 99` | **WORTHY** |
|
|
336
|
+
| `100` | **FORGED** |
|
|
337
|
+
| `null` | **UNKNOWN**: test bildirimi bulunamadı |
|
|
284
338
|
|
|
285
|
-
|
|
339
|
+
**Nasıl hesaplanır.** Önem bir temel kesinti belirler (`error −8`, `warning −3`, `info −1`) ve kanıt düzeyi bunu indirir: E2 tam, E1 yarım (aşağı yuvarlanarak), E0 hiç sayılmaz. Toplam, paketin maruziyetine göre normalleştirilir; yani dosya başına değil test bildirimi başına kesinti. Terminal, puanın kullandığı indirilmiş sayıların aynısını yazdırır; gizli ikinci bir model yoktur. Ayrıntılar: [docs/SCORING.md](docs/SCORING.md) ve [puanlama rehberi](https://sergey-bar.github.io/Mjolnir/guide/scoring).
|
|
286
340
|
|
|
287
|
-
**
|
|
288
|
-
oranı taşıyor** (her biri için ≥ 10 elle sınıflandırılmış bulgu; bkz.
|
|
289
|
-
[docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Diğer 21'i yazarın tahminine göre
|
|
290
|
-
yayına giriyor. Her tarama alt bilgisi, _tetiklenen_ kuralların kaçının
|
|
291
|
-
ölçüldüğünü söyler; `mjolnir rules --unmeasured` ölçülmeyenleri listeler;
|
|
292
|
-
her kuralın `mjolnir explain` sayfası durumunu belirtir. Oranı çirkin
|
|
293
|
-
karantinada. O sayıyı büyütmek, projenin süregelen işidir.
|
|
341
|
+
**100'ün anlamadığı şey.** Yazılımın doğru, paketin yeterli ya da ürünün hatasız olduğu anlamına gelmez. Tek bir anlamı vardır: **Mjölnir'in değerlendirdiği kuralların hiçbiri bu taramada ve bu kanıt modelinde kesinti üretmedi.**
|
|
294
342
|
|
|
295
|
-
|
|
343
|
+
<br />
|
|
296
344
|
|
|
297
|
-
|
|
298
|
-
`extended` veya `quarantine` olur:
|
|
345
|
+
## Kanıt modeli
|
|
299
346
|
|
|
300
|
-
|
|
301
|
-
| ------------ | ------------------------------------------- | :---------------: | :--------: |
|
|
302
|
-
| `core` | ≤ %10 ölçülmüş FP | ✅ | ✅ |
|
|
303
|
-
| `extended` | ≤ %30 ölçülmüş FP | ✅ | ✅ |
|
|
304
|
-
| `quarantine` | %30 üzerinde veya henüz ölçülmemiş (n < 10) | ❌ | ✅ |
|
|
347
|
+
Her bulgu iki etiket taşır: Mjölnir'in ne kadar emin olduğu ve bulgunun ne kadar denetlendiği. Kalıp raporlayan bir araçla bir sürümü kapıya bağlayabileceğiniz bir araç arasındaki fark budur.
|
|
305
348
|
|
|
306
|
-
|
|
307
|
-
| --------------- | ------------- | -------------------------------------------------------- |
|
|
308
|
-
| TypeScript / JS | Derleyici AST | en geniş, en çok ölçülmüş — çoğunlukla `core`/`extended` |
|
|
309
|
-
| Python / pytest | Regex katmanı | geniş, corpus denetimli — çoğunlukla `core`/`extended` |
|
|
310
|
-
| Java | Regex katmanı | daha yeni — çoğunlukla `extended`/`quarantine` |
|
|
311
|
-
| C# / .NET | Regex katmanı | daha yeni — çoğunlukla `extended`/`quarantine` |
|
|
349
|
+
**Ne kadar emin — kanıt düzeyi.**
|
|
312
350
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
351
|
+
| Düzey | Ad | Anlamı | Kesinti |
|
|
352
|
+
| ------ | ------------------- | ----------------------------------------------------- | ------- |
|
|
353
|
+
| **E2** | Deterministik kanıt | Kusur, kodda yazıldığı hâliyle mevcut | Tam |
|
|
354
|
+
| **E1** | Kalıp kanıtı | Kusurla güçlü biçimde bağlantılı bir kalıp eşleşti | Yarım |
|
|
355
|
+
| **E0** | Gözlem | Bilmeye değer. Bir şeyin yanlış olduğu iddiası değil. | Sıfır |
|
|
317
356
|
|
|
318
|
-
|
|
357
|
+
Bir tespitteki güven, kanıtın gücü değildir. Bir kural aradığını bulduğundan emin olabilir ve yine de bir sezgisel yönteme bakıyor olabilir. E1 bulguları okunmak ve değerlendirilmek içindir, asla körü körüne uygulanmak için değil; bu sınır bulgunun üzerinde terminalde, JSON'da ve ajana devirde işaretlidir.
|
|
319
358
|
|
|
320
|
-
|
|
359
|
+
**Ne kadar denetlendi — güven düzeyi.** Bulguların çoğu kodunuzu okumaktan gelir. Mjölnir'e gerçek bir test çalıştırmasının raporunu verin, kodun gerçekten çalıştığını doğrulayabilsin.
|
|
321
360
|
|
|
322
361
|
<p align="center">
|
|
323
|
-
<img src="assets/readme/
|
|
362
|
+
<img src="assets/readme/trust-ladder.svg" alt="L0'dan L5'e güven merdiveni. L0–L2 kodu okumaktan gelir; L3–L5 gerçek bir çalıştırma raporu gerektirir, bu da merdivendeki bir kırılmayla işaretlenir." width="100%" />
|
|
324
363
|
</p>
|
|
325
364
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
365
|
+
| Düzey | Sade bir dille | Ne gerektirir |
|
|
366
|
+
| ------ | --------------------- | ------------------------------------------------------------------ |
|
|
367
|
+
| **L0** | Not edildi | Kodu okumak |
|
|
368
|
+
| **L1** | Sorun gibi görünüyor | Kodu okumak: bir kalıp eşleşti |
|
|
369
|
+
| **L2** | Kodda kanıtlandı | Kodu okumak: kusur yapısal |
|
|
370
|
+
| **L3** | Dosya çalıştı | Bir çalıştırma raporu bulgunun dosyasının yürütüldüğünü gösteriyor |
|
|
371
|
+
| **L4** | Test çalıştı | Bir çalıştırma raporu bulgunun testinin yürütüldüğünü gösteriyor |
|
|
372
|
+
| **L5** | Çalıştırma doğruluyor | Çalıştırmanın kendi sonucu kusur sınıfını doğruluyor |
|
|
329
373
|
|
|
330
|
-
|
|
331
|
-
maruziyetine göre normalizasyon (test bildirimi başına kesinti).
|
|
332
|
-
Kanıtla ağırlıklandırılan kesintiler, zayıf sinyallerin daha az pahalı
|
|
333
|
-
olduğu anlamına gelir. Terminal, puanın kullandığı aynı iskontolu
|
|
334
|
-
sayıları gösterir — kara kutu yok. Tam yöntem:
|
|
335
|
-
[docs/SCORING.md](docs/SCORING.md).
|
|
374
|
+
Statik bir tarama L2'de durur. Yalnızca gerçek bir çalıştırma raporu (Playwright JSON, Jest veya Vitest JSON, JUnit XML) bir bulguyu L3 ve üstüne çıkarabilir; bu yüzden hiç çalışırken görülmemiş bir bulgu asla çalıştığını iddia edemez. Tanımlar: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
|
|
336
375
|
|
|
337
|
-
|
|
376
|
+
### Bunun ne kadarı ölçülmüş
|
|
338
377
|
|
|
339
|
-
|
|
340
|
-
| ------- | ---------------- |
|
|
341
|
-
| ≥ 80 | ✓ **WORTHY** |
|
|
342
|
-
| 50 – 79 | ⚠ **NEEDS WORK** |
|
|
343
|
-
| < 50 | ✖ **UNWORTHY** |
|
|
378
|
+
**79 kuraldan 74'ünün gerçek OSS koduna karşı ölçülmüş bir yanlış pozitif oranı var** (her biri için en az 10 elle sınıflandırılmış bulgu; bkz. [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Diğer 5'i yazarın tahminiyle yayımlanır ve bunu `mjolnir explain` içinde kural kural söyler. `mjolnir rules --unmeasured` onları listeler ve her tarama altbilgisi, gerçekten _tetiklenen_ kurallardan kaçının ölçülmüş olduğunu bildirir.
|
|
344
379
|
|
|
345
|
-
|
|
346
|
-
ağırlığını belirler:
|
|
380
|
+
Oranlar kötü olduğunda da herkese açık kalır. QA-TEST-001 (commit edilmiş bir `.only`) gerçek depolardaki denetimde kötü sonuç verir ve bu yüzden quarantine'dedir. QA-PW-141 dahil her kuralın güncel sayısı denetimdedir.
|
|
347
381
|
|
|
348
|
-
|
|
349
|
-
| ----- | ----------------- | --------------------- | --------------------------------------------------------- |
|
|
350
|
-
| E2 | Belirleyici kusur | Tam kesinti | Commit edilmiş `.only` — yapısal olarak kanıtlanabilir |
|
|
351
|
-
| E1 | Sezgisel örüntü | Yarım kesinti | Regex ile yakalanan `sleep()` — güçlü sinyal, kanıt değil |
|
|
352
|
-
| E0 | Gözlem | Sıfır (yalnızca info) | Bildirilir ama asla CI'ı gate'lemez ve kesinti yapmaz |
|
|
382
|
+
### Kural güven düzeyleri
|
|
353
383
|
|
|
354
|
-
|
|
355
|
-
eder: E2 bulguları yapısal kanıttır; E1 bulguları doğru konumlanmış
|
|
356
|
-
uyarılarıdır, resmî kanıt değildir.
|
|
384
|
+
Düzeyler görüşe değil, ölçülmüş yanlış pozitif oranına göre belirlenir:
|
|
357
385
|
|
|
358
|
-
|
|
359
|
-
|
|
386
|
+
| Düzey | Ölçülmüş FP | Davranış |
|
|
387
|
+
| -------------- | ---------------------------- | ------------------------------------------------------ |
|
|
388
|
+
| **core** | ≤ 10% | Varsayılan rapor, engeller |
|
|
389
|
+
| **extended** | ≤ 30% | Varsayılan rapor, daha düşük güven |
|
|
390
|
+
| **quarantine** | > 30% veya açıkça bildirilen | Yalnızca `--strict`, info ile sınırlı, asla engellemez |
|
|
391
|
+
| _ölçülmemiş_ | n < 10 | Ölçülene kadar core düzeyine yükseltilemez |
|
|
360
392
|
|
|
361
|
-
|
|
393
|
+
FP bantları yalnızca bir kademe düşürebilir — açıkça orada bildirilmişse bir kuralı `quarantine` dışına çıkarmaz. Açıkça quarantine'a alınmış bir kural, ölçülen FP oranından bağımsız olarak quarantine'de kalır.
|
|
362
394
|
|
|
363
|
-
|
|
395
|
+
Yükseltme, düşürme ve dil bazında olgunluk: [kural yaşam döngüsü](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
|
|
364
396
|
|
|
365
|
-
|
|
366
|
-
dayanıklı:
|
|
397
|
+
### Bu neden bir linter değil
|
|
367
398
|
|
|
368
|
-
|
|
369
|
-
▚ SELECTOR HEALTH — e2e/checkout.spec.ts
|
|
399
|
+
Linter'lar kodun kurallara uyup uymadığını söyler. Mjölnir doğrulamanıza güvenilip güvenilemeyeceğini söyler.
|
|
370
400
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
401
|
+
| | Linter'lar (ESLint, SonarQube) | Kapsam araçları | Yapay zekâ ile kod incelemesi | **Mjölnir** |
|
|
402
|
+
| ------------------------------------------------------------------- | :----------------------------: | :-------------: | :---------------------------: | :---------------: |
|
|
403
|
+
| Ürün kodunu değil, **doğrulama sistemini** puanlar | Hayır | Hayır | Hayır | Evet |
|
|
404
|
+
| CI workflow bütünlüğü (`continue-on-error`, `\|\| true`) | Hayır | Hayır | yalnızca diff | Evet |
|
|
405
|
+
| Playwright locator dayanıklılığını derecelendirir (Selector Health) | Hayır | Hayır | Hayır | Evet |
|
|
406
|
+
| `TRUE-FLAKE` kararları için gerçek çalıştırma verisi okur | Hayır | Hayır | Hayır | Evet |
|
|
407
|
+
| Kural başına ölçülmüş bir yanlış pozitif oranı yayımlar | Hayır | Hayır | Hayır | Evet |
|
|
408
|
+
| Doğrulamasız testleri işaretler | Evet\* | Hayır | bazen | Evet |
|
|
409
|
+
| Sabit sleep'leri yakalar (`waitForTimeout`, `time.sleep`) | Evet\* | Hayır | bazen | Evet |
|
|
410
|
+
| Deterministik (aynı girdi, aynı çıktı) | Evet | Evet | Hayır | Evet |
|
|
411
|
+
| Tarama başına maliyet | ücretsiz | ücretsiz | token | **sıfır** (yerel) |
|
|
374
412
|
|
|
375
|
-
|
|
376
|
-
puanı batırır — herhangi bir DOM yeniden düzenlemesinde, hangi davranışın
|
|
377
|
-
gerilediğini söylemeden kırılırlar.
|
|
413
|
+
<sub>\*`eslint-plugin-jest` ve `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) ile SonarQube'un kendi doğrulama kuralları tarafından kapsanır. Sütunlar, test paketi doğrulaması için varsayılan davranışı tanımlar; eklentiler, ücretli planlar ve özel kurallar bazı yanıtları değiştirir. Bu bir konumlandırma özetidir, kıyaslama değil.</sub>
|
|
378
414
|
|
|
379
|
-
|
|
415
|
+
Yapay zekâ incelemesini de kullanın. Hiçbir kalıbın bulamayacağı nüansları, niyeti ve tasarım kusurlarını yakalar. Mjölnir ise kasıtlı göründüğü için yapay zekâ incelemesinin gözden kaçırdığını yakalar: commit edilmiş bir `.only`, yutulmuş bir çıkış kodu, bir test job'undaki `continue-on-error`. Bunlar akıl yürütme değil tarama gerektirir.
|
|
380
416
|
|
|
381
|
-
|
|
417
|
+
<br />
|
|
382
418
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
JUnit XML
|
|
419
|
+
## Test çalıştırma analizi
|
|
420
|
+
|
|
421
|
+
Statik analiz hiç çalışmamış kod hakkında akıl yürütür. Çalıştırma analizi ise gerçekte ne olduğunu okur: herhangi bir çalıştırıcıdan Playwright JSON, Jest JSON, Vitest JSON ve JUnit XML.
|
|
386
422
|
|
|
387
423
|
```bash
|
|
388
424
|
mjolnir forensics ./test-results/
|
|
389
425
|
```
|
|
390
426
|
|
|
391
427
|
```text
|
|
392
|
-
|
|
428
|
+
▍ FLAKINESS LEADERBOARD
|
|
393
429
|
|
|
394
430
|
3 tests · 1 failed · 1 flaky · 1 retried
|
|
395
431
|
|
|
@@ -399,297 +435,184 @@ FAILING declines an expired card (e2e/checkout.spec.ts)
|
|
|
399
435
|
████░░░░░░░░░░░░░░░░ 1.1s · 1 attempt
|
|
400
436
|
```
|
|
401
437
|
|
|
402
|
-
|
|
403
|
-
testtir. Son yeşil onaydan bağımsız olarak `TRUE-FLAKE` olarak
|
|
404
|
-
işaretlenir.
|
|
438
|
+
`TRUE-FLAKE` testin yeniden denendiği anlamına gelmez. Testin **en az bir denemede başarısız olup ardından yeşil bittiği** anlamına gelir: son onay işareti ne derse desin işaretlenen şanslı bir geçiş. `mjolnir triage` bu geçmişi bir karantina önerisine dönüştürür, `mjolnir pw-report` ise bir çalıştırmayı özetler. Bulguları L3 ve üzeri güven düzeylerine çıkaran da aynı çalıştırma raporlarıdır.
|
|
405
439
|
|
|
406
|
-
|
|
440
|
+
<br />
|
|
407
441
|
|
|
408
|
-
##
|
|
442
|
+
## CI bütünlüğü
|
|
409
443
|
|
|
410
|
-
|
|
411
|
-
güvenilip güvenilemeyeceğini söyler.
|
|
444
|
+
Bir test geçerken çevresindeki pipeline başarısız olamayabilir. Mjölnir workflow'ları da okur: `continue-on-error`, `|| true`, hiç aktarılmayan çıkış kodları, her zaman başarılı olan step'ler, kullanılan ama hiç üretilmeyen raporlar ve engellemesi gereken olaylarda atlanan kapılar. Her bulgu job'u, step'i ve satırı belirtir ve kendi kanıt düzeyini taşır.
|
|
412
445
|
|
|
413
|
-
|
|
414
|
-
| ------------------------------------------------------------- | :----------------: | :---------------: | :-------------: | :---------: |
|
|
415
|
-
| CI workflow bütünlüğü (`continue-on-error`, `\|\| true`) | ❌ | ❌ | nadiren | ✅ |
|
|
416
|
-
| Tek araçla çapraz dil (TS, Python, Java, C#) | ❌ | ❌ | ❌ | ✅ |
|
|
417
|
-
| Playwright locator dayanıklılığını not eder (Selector Health) | ❌ | ❌ | nadiren | ✅ |
|
|
418
|
-
| Gerçek assertion'ı olmayan testleri işaretler | ✅ (eklenti)\* | ❌ | bazen | ✅ |
|
|
419
|
-
| Katı sleep'leri yakalar (`waitForTimeout`, `time.sleep`) | ✅ (eklenti)\* | ❌ | bazen | ✅ |
|
|
420
|
-
| Saniyeler içinde çalışır, tarama sırasında sıfır ağ çağrısı | ✅ | ✅ | — | ✅ |
|
|
446
|
+
PR workflow'unu üretin, varsayılan olarak tavsiye niteliğindedir:
|
|
421
447
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
448
|
+
```bash
|
|
449
|
+
mjolnir ci install
|
|
450
|
+
```
|
|
425
451
|
|
|
426
|
-
|
|
427
|
-
kategoridir:
|
|
452
|
+
Ya da Marketplace action'ını mevcut bir workflow'a ekleyin:
|
|
428
453
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
454
|
+
```yaml
|
|
455
|
+
- uses: Sergey-Bar/Mjolnir@v1
|
|
456
|
+
with:
|
|
457
|
+
scope: changed
|
|
458
|
+
fail-on: error
|
|
459
|
+
```
|
|
434
460
|
|
|
435
|
-
|
|
436
|
-
flakiness raporu üretmez.
|
|
461
|
+
Ana sürüm hattını izlemek için `@v1`'i, tekrarlanabilir bir kapı için ise tam bir etiketi (`@v0.5.32`) sabitleyin. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) Marketplace'i, Smithery'yi ve MCP kayıtlarını kapsar.
|
|
437
462
|
|
|
438
|
-
|
|
463
|
+
Bulguları GitHub Code Scanning'e aktarmak için SARIF yükleyin (workflow veya job kapsamında `security-events: write` gerekir):
|
|
439
464
|
|
|
440
|
-
|
|
465
|
+
```yaml
|
|
466
|
+
- run: npx mjolnir-qa@latest --format sarif > mjolnir.sarif
|
|
467
|
+
continue-on-error: true
|
|
468
|
+
- uses: github/codeql-action/upload-sarif@v3
|
|
469
|
+
if: ${{ !cancelled() }}
|
|
470
|
+
with:
|
|
471
|
+
sarif_file: mjolnir.sarif
|
|
472
|
+
```
|
|
441
473
|
|
|
442
|
-
|
|
443
|
-
değişikliğini fark edebilir; doğrulama sisteminin bütünüyle güvenilir
|
|
444
|
-
olduğunu kanıtlamaz — ve yalnızca ona gösterdiğiniz diff'i görür.
|
|
474
|
+
GitLab'de `--format codequality`, MR widget'ının ve diff açıklamalarının okuduğu Code Quality raporunu yazar ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Düzenleyici ve pipeline kurulumu: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
|
|
445
475
|
|
|
446
|
-
|
|
447
|
-
| -------------------------------------------- | :-------------------------------: | :-------------------------------------------: |
|
|
448
|
-
| Tarama başına maliyet | Token (diff boyutuyla ölçeklenir) | **Sıfır** (yerel, kurulu) |
|
|
449
|
-
| 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** |
|
|
450
|
-
| Belirleyici (aynı girdi → aynı çıktı) | ❌ (belirsiz) | **✅** |
|
|
451
|
-
| Aylardır uyuyan örüntüleri yakalar | Yalnızca bağlamdaysa | **✅** (tüm dosyaları tarar) |
|
|
452
|
-
| Çalıştırmalar arasında bulguları hatırlar | ❌ (oturumlar arası bellek yok) | **✅** (baseline + diff) |
|
|
453
|
-
| İnsan tetiklemesi olmadan çalışır | PR veya prompt gerekir | **✅** (CI kancası, saniyeler içinde çalışır) |
|
|
476
|
+
### Değişen kapsamda atıf
|
|
454
477
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
`.only`, yutulmuş bir exit kodu, test işindeki bir `continue-on-error`.
|
|
459
|
-
Bunlar akıl gerektiren hatalar değil; tarama gerektiren olgulardır.
|
|
478
|
+
```bash
|
|
479
|
+
npx mjolnir-qa@latest --scope changed
|
|
480
|
+
```
|
|
460
481
|
|
|
461
|
-
|
|
482
|
+
Bulgular, dalınızın eklediği satırlara **merge-base**'e göre ölçülerek atfedilir. Kapsam, tam bir taramanın keşfettiği dosya kümesinin aynısıdır (TS/JS spec'leri ve adaptör yapılandırmaları, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`); buna commit edilmemiş ve izlenmeyen değişiklikler de eklenir, böylece commit etmeden önce de çalışır. Taban `main → master → origin/main → origin/master → origin/HEAD` sırasıyla çözülür; `--base <ref>` ile geçersiz kılabilirsiniz.
|
|
462
483
|
|
|
463
|
-
|
|
484
|
+
merge-base çözülemediğinde (sığ bir klon, ayrık bir HEAD, git dışında bir hedef), bulgular tüm dosyaya atfa geri döner **ve rapor bunu söyler.** Sessiz bir geri dönüş, bu aracın yakalamak için var olduğu türden bir kusur olurdu.
|
|
464
485
|
|
|
465
|
-
|
|
466
|
-
asla engellemeyen:
|
|
486
|
+
<br />
|
|
467
487
|
|
|
468
|
-
|
|
469
|
-
mjolnir ci install
|
|
470
|
-
```
|
|
488
|
+
## Yapay zekâ ajanları
|
|
471
489
|
|
|
472
|
-
|
|
490
|
+
Bulgular ancak bir şey onlara göre harekete geçerse bir değer taşır.
|
|
473
491
|
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
- uses: github/codeql-action/upload-sarif@v3
|
|
477
|
-
with:
|
|
478
|
-
sarif_file: mjolnir.sarif
|
|
492
|
+
```text
|
|
493
|
+
SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
|
|
479
494
|
```
|
|
480
495
|
|
|
481
|
-
|
|
482
|
-
[docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
|
|
483
|
-
|
|
484
|
-
### Değişen kapsam kapsamı
|
|
496
|
+
**Düzeltmeyi yapay zekâ yazar. Mjölnir onu doğrular.** Kanıt yeniden taramadan gelir, asla ajanın kendi başarı raporundan değil.
|
|
485
497
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
(
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
dürüstçe geriler: bulgular tüm dosya atfına döner ve rapor bunu söyler.
|
|
492
|
-
Taban referansını `--base <ref>` ile geçersiz kılın.
|
|
498
|
+
| Komut | Ajanın aldığı |
|
|
499
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
500
|
+
| `mjolnir mcp` | stdio üzerinden bir [MCP](https://modelcontextprotocol.io) sunucusu. `scan`, `explain` ve `diff` çağrılabilir araçlara dönüşür. |
|
|
501
|
+
| `mjolnir handoff` | Kaydedilmiş bir `--json` raporu deterministik bir Markdown planına dönüşür: neyin tespit edildiği, her bulgunun kanıt sınırı, neyin **değişmemesi** gerektiği ve nasıl doğrulanacağı. |
|
|
502
|
+
| `mjolnir install` | Deponuzda zaten bulunan ajan yüzeylerine yazar (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`), böylece ajan bitti demeden önce yeniden tarar. |
|
|
493
503
|
|
|
494
|
-
|
|
504
|
+
Kendi CLI'ı olan bir istemciye ekleyin:
|
|
495
505
|
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
`mjolnir.config.json` (veya `.mjolnir.json`) şiddeti, kapıyı ve kapsamı
|
|
500
|
-
ayarlar — algılama anlamını asla değiştirmez.
|
|
506
|
+
```bash
|
|
507
|
+
claude mcp add mjolnir -- npx -y mjolnir-qa@latest mcp
|
|
508
|
+
```
|
|
501
509
|
|
|
502
|
-
|
|
503
|
-
| ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
504
|
-
| `exclude` | `string[]` | Ek ignore glob'ları (gitignore alt kümesi), yerleşik varsayılanların üzerine |
|
|
505
|
-
| `gate` | `"advisory" \| "error" \| "warning"` | Hangi şiddetlerin sıfır olmayan kodla çıkacağı (varsayılan `error`; `advisory` asla engellemez) |
|
|
506
|
-
| `severityOverrides` | `{ "<RULE-ID>": severity }` | Bir kuralın bulgularını deponuz için yeniden sıralar |
|
|
507
|
-
| `ignore` | `IgnoreEntry[]` | Bulguları bastırır — **`reason` zorunludur**; girdiler 90 gün sonra sona erer (açık bir `expires` tarihi, ya da tarihi olmayan girdiler için yapılandırma dosyasının son değişiklik zamanı) |
|
|
508
|
-
| `plugins` | `string[]` | Üçüncü taraf kural paketleri (bkz. [Güven modeli](#güven-modeli)) |
|
|
510
|
+
Ya da `mcpServers` bloğu kabul eden herhangi bir istemciye:
|
|
509
511
|
|
|
510
512
|
```json
|
|
511
513
|
{
|
|
512
|
-
"
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
"ignore": [
|
|
516
|
-
{
|
|
517
|
-
"ruleId": "QA-TEST-004",
|
|
518
|
-
"files": ["e2e/legacy-login.spec.ts"],
|
|
519
|
-
"reason": "Third-party widget needs a settle delay; tracked in JIRA-4821",
|
|
520
|
-
"expires": "2026-12-31"
|
|
521
|
-
}
|
|
522
|
-
]
|
|
514
|
+
"mcpServers": {
|
|
515
|
+
"mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@latest", "mcp"] }
|
|
516
|
+
}
|
|
523
517
|
}
|
|
524
518
|
```
|
|
525
519
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
`--max-duration <sec>` (sınırlı kısmi tarama).
|
|
534
|
-
- Kural bastırma ve kullanımdan kaldırma yaşam döngüsü:
|
|
535
|
-
[docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md).
|
|
520
|
+
**Korkuluk, kolaylıktan daha önemlidir.** Bir devirdeki her bulgu kendi sınırını taşır. **E2** der ki _deterministik: konumu kontrol edin ve düzeltmeyi uygulayın_. **E1** der ki _ONAY GEREKTİRİR: gözlem tek başına kusuru kanıtlamaz_. E1'i körü körüne düzelten, bir kuralı bastıran ya da puanı yükseltmek için bir kuralı düzenleyen bir ajan, tam da bu aracın yakalamak için var olduğu şeyi yapıyordur; bu yüzden devir bunu prompt'ta, bulgunun hemen yanında söyler.
|
|
521
|
+
|
|
522
|
+
<br />
|
|
523
|
+
|
|
524
|
+
## Güven ve güvenlik
|
|
525
|
+
|
|
526
|
+
**Önce yerel, sıfır telemetri.** `src/` içinde hiçbir yerde ağ yeteneğine sahip bir API (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket) yoktur ve [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) biri ortaya çıkarsa derlemeyi başarısız kılar. Ayrıca `eval` ve `new Function` kullanımını da yasaklar. Güvenilmeyen kodu taramak onu asla yürütmez: statik analiz kaynak metni okur, çalıştırma analizi ise diskte zaten bulunan rapor dosyalarını ayrıştırır.
|
|
536
527
|
|
|
537
|
-
`
|
|
538
|
-
bu komut şu anda bastırılanları ve her girdinin ne zaman sona ereceğini
|
|
539
|
-
listeler.
|
|
528
|
+
İki çekince: `npx` herhangi bir şey çalışmadan önce paketi kendisi indirir ve bu garanti üçüncü taraf eklentileri değil, `src/`'yi kapsar.
|
|
540
529
|
|
|
541
|
-
|
|
530
|
+
**Eklentiler korumalı alanda çalışmaz.** JS eklentileri (`mjolnir-rules/*.mjs` ya da `"plugins"` altında listelenen npm paketleri) tam Node yetkileriyle çalışır; ESLint ya da Vitest eklentileriyle aynı güven modeli. Onları yüklemek **tarama başına** açıkça seçilmelidir: `--enable-plugins` (veya `MJOLNIR_ENABLE_PLUGINS=1`) olmadan kaynakları asla yüklenmez ve stderr'deki bir bildirim nelerin atlandığını listeler. JSON kural manifestoları kod yürütmez ve core kural kimliği önekleri ayrılmıştır, böylece bir eklenti onlardan birinin kılığına giremez. Güvenlik açıklarını [SECURITY.md](SECURITY.md) üzerinden bildirin.
|
|
542
531
|
|
|
543
|
-
|
|
532
|
+
**Kendi üzerinde çalışır.** Bir doğrulama güven motoru, kendisi doğrulanabilir değilse hiçbir itibara sahip olamaz. Her CI çalıştırması bu depoyu, aynı çalıştırmanın ürettiği derlemeyle tarar. Kapı, error önem düzeyindeki herhangi bir bulguda ve ayrıca **kısmi** bir taramada ya da **çöken bir kuralda** başarısız olur; çünkü hiçbir şey raporlamayan yarım kalmış bir öz tarama, bu projenin yakalamak için var olduğu sahte yeşilin ta kendisidir. `mjolnir doctor` aynı çalıştırmada kural tabanını yeniden denetler (fixture güvenlik duvarı, düzey dürüstlüğü, core düzeyi üst sınırı) ve INCONCLUSIVE sonuçlu bir denetim, başarısız bir denetimle tamamen aynı şekilde başarısız olur. Her iki rapor da derleme artefaktı olarak yüklenir.
|
|
544
533
|
|
|
545
|
-
|
|
534
|
+
### Çıkış kodları ve makine sözleşmesi
|
|
535
|
+
|
|
536
|
+
Donmuştur; böylece üzerlerine CI mantığı kurabilirsiniz:
|
|
546
537
|
|
|
547
538
|
| Çıkış kodu | Anlamı |
|
|
548
539
|
| ---------- | ------------------------------------------------------------------------- |
|
|
549
|
-
| `0` | Temiz
|
|
550
|
-
| `1` | Kapı düzeyinde
|
|
551
|
-
| `2` | Kısmi tarama (zaman bütçesi doldu, okunamayan dosyalar)
|
|
552
|
-
| `10` | Kullanım hatası (hatalı bayrak, hedef
|
|
553
|
-
| `20` |
|
|
554
|
-
|
|
555
|
-
JSON/SARIF raporu `schemaVersion: 1`'dir. Kural kimlikleri
|
|
556
|
-
(`QA-<FAMILY>-NNN`) sevk edildikten sonra değişmez ve asla yeniden
|
|
557
|
-
kullanılmaz.
|
|
558
|
-
|
|
559
|
-
---
|
|
560
|
-
|
|
561
|
-
## Güven modeli
|
|
562
|
-
|
|
563
|
-
- **Local-first** — tarama sırasında sıfır ağ çağrısı. Asla. Sıfır
|
|
564
|
-
telemetri.
|
|
565
|
-
- **Yanlış kanıt yok** — «doğrulandı» demek yerine «bilinmiyor» demeyi
|
|
566
|
-
tercih ederiz. Boş repo `score: null` alır, sahte 100 asla.
|
|
567
|
-
- **Kısmi dürüstlük** — analiz yarıda kesildiyse çıktı bunu söyler.
|
|
568
|
-
Öyle olmadığında asla «complete» demez.
|
|
569
|
-
- **FP duvarı** — algılama, yorumlardan/dizelerden arınmış kod
|
|
570
|
-
görünümü üzerinde çalışır (TypeScript kuralları derleyici AST'sini
|
|
571
|
-
kullanır): düz yazı yorumu içindeki veya doküman örnek dizesindeki bir
|
|
572
|
-
örüntü, dokümantasyondur — bulgu değildir.
|
|
573
|
-
- **Ölçülmüş, iddia edilmiş değil** — yalnızca gerçek OSS kodundan
|
|
574
|
-
yanlış pozitif oranı olan kurallar başlık katmanlarına girer (bkz.
|
|
575
|
-
[Ne kadarı ölçülmüş](#ne-kadarı-ölçülmüş)); tarama alt bilgisi ve
|
|
576
|
-
`mjolnir rules --unmeasured` hangisinin ne olduğunu söyler.
|
|
577
|
-
- **Eklenti güveni ve yürütme kapısı** — eklentiler `"plugins"` altında
|
|
578
|
-
bildirilen npm paketleridir; JS modülleri `mjolnir-rules/*.mjs`
|
|
579
|
-
içinde yaşar. **Sandbox yok**: eklenti kodu tam Node ayrıcalıklarıyla
|
|
580
|
-
çalışır; ESLint veya Vitest eklentileriyle aynı güven modeli. Bu
|
|
581
|
-
yüzden kod yürütme **her taramada opt-in**'dir: `--enable-plugins`
|
|
582
|
-
geçirin (veya `MJOLNIR_ENABLE_PLUGINS=1` ayarlayın), yoksa kaynaklar
|
|
583
|
-
YÜKLENMEZ — gürültülü bir stderr bildirimi atlananları tam olarak
|
|
584
|
-
listeler. Güvenilmeyen kodu taramak onu asla çalıştırmaz. JSON kural
|
|
585
|
-
bildirimleri (`mjolnir-rules/*.json`) etkilenmez: regex desenleri
|
|
586
|
-
bildirirler ve tasarımları gereği hiçbir kod çalıştırmazlar. Çekirdek
|
|
587
|
-
kural kimliği önekleri rezerve edilmiştir ve kimlik taklidini önlemek
|
|
588
|
-
için eklentilerden ve dış kurallardan reddedilir.
|
|
589
|
-
- **Workspace-yerel dış kurallar** (klasör tabanlı, sıfır ağ) — tarama
|
|
590
|
-
hedefinin yanındaki bir `mjolnir-rules/` dizini özel kurallar yükler:
|
|
591
|
-
JSON dosyaları regex örüntüleri bildirir (kod yürütülmez),
|
|
592
|
-
`.mjs`/`.js` modülleri `rules` dışa aktarır (tam Node güveni,
|
|
593
|
-
eklentiler gibi). Dış kurallar çekirdekle aynı güven üstverilerini
|
|
594
|
-
taşır; asla çekirdek katmanına giremezler (çekirdek, corpus yan
|
|
595
|
-
dosyasından ölçülmüş bir FP oranı gerektirir — bildirilen
|
|
596
|
-
`tier: "core"`, `extended`'a sıkıştırılır), katman üst sınırlarına
|
|
597
|
-
uyar ve sapma için denetlenir: `mjolnir rules --md --external`,
|
|
598
|
-
kataloğu yüklenen dosyalardan görüntüler (kaynak `external`);
|
|
599
|
-
matris üreteci `--external <root>` kabul eder.
|
|
600
|
-
|
|
601
|
-
---
|
|
602
|
-
|
|
603
|
-
## 🏗️ Mimari
|
|
540
|
+
| `0` | Temiz: kapı düzeyinde ya da üstünde bulgu yok |
|
|
541
|
+
| `1` | Kapı düzeyinde ya da üstünde bulgular |
|
|
542
|
+
| `2` | Kısmi tarama (zaman bütçesi doldu, okunamayan dosyalar). Asla engellemez. |
|
|
543
|
+
| `10` | Kullanım hatası (hatalı bayrak, eksik hedef) |
|
|
544
|
+
| `20` | Dahili hata |
|
|
604
545
|
|
|
605
|
-
|
|
606
|
-
<summary>Ağacı genişlet</summary>
|
|
546
|
+
`2` bilinçli olarak `0`'dan farklıdır: bitmeyen bir tarama "hiçbir şey bulmamış" değildir. Yalnızca aramayı bitirmemiştir.
|
|
607
547
|
|
|
608
|
-
|
|
609
|
-
mjolnir/
|
|
610
|
-
├── src/
|
|
611
|
-
│ ├── engine/ # LanguageAdapter interface + rule runner
|
|
612
|
-
│ ├── adapters/ # typescript · python · java · csharp · github-actions
|
|
613
|
-
│ ├── rules/ # rules across 8 families + the measured-FP table
|
|
614
|
-
│ ├── playwright/ # Selector Health Score engine
|
|
615
|
-
│ ├── discovery/ # workspace, frameworks, ignore resolution
|
|
616
|
-
│ ├── scope/ # git merge-base changed-scope engine
|
|
617
|
-
│ ├── scorer/ # transparent deduction table + prioritization
|
|
618
|
-
│ ├── reporter/ # terminal · JSON · SARIF 2.1 · Mermaid
|
|
619
|
-
│ ├── forensics/ # run-data ingestion · flake verdicts · triage
|
|
620
|
-
│ ├── config/ # mjolnir.config.json + suppressions
|
|
621
|
-
│ ├── plugins/ # third-party rule loading (no sandbox)
|
|
622
|
-
│ └── commands/ # every subcommand
|
|
623
|
-
└── tests/
|
|
624
|
-
├── fixtures/ # must-fire / must-not-fire per rule
|
|
625
|
-
└── golden/ # frozen score regression locks
|
|
626
|
-
```
|
|
548
|
+
Bir makinenin tükettiği her şey (MCP araç sonuçları, `--json`, SARIF 2.1), sürümlü ve **yalnızca eklemeli** bir şema (`schemaVersion: 1`, `contractVersion: 1`) altındaki tek bir kanonik sonuçtan gelir; böylece hiçbir tüketici anlamı işlenmiş metinden yeniden kurmak zorunda kalmaz. Bkz. [makine sözleşmesi](docs/machine-contract.md). Kural kimlikleri (`QA-<FAMILY>-NNN`) yayımlandıktan sonra değiştirilemez ve asla yeniden kullanılmaz.
|
|
627
549
|
|
|
628
|
-
|
|
550
|
+
<br />
|
|
629
551
|
|
|
630
|
-
|
|
631
|
-
I/O yok, global yok. Yeni bir ekosistem = bir adaptör + onun
|
|
632
|
-
kuralları.
|
|
633
|
-
- **TypeScript/Playwright derleyici AST'sini kullanır** (ts-morph).
|
|
634
|
-
Python, Java ve C#, maskeli yorum/dizeli paylaşılan bir regex
|
|
635
|
-
katmanında çalışır.
|
|
636
|
-
- Java ve C# için bir tree-sitter WASM AST katmanı mevcuttur ve bir
|
|
637
|
-
sonraki hassasiyet adımıdır — henüz senkron tarama hattına bağlı
|
|
638
|
-
değildir.
|
|
552
|
+
## Mjölnir'in size söyleyemedikleri
|
|
639
553
|
|
|
640
|
-
|
|
554
|
+
- **Testlerinizi çalıştırmaz.** Temiz bir tarama, geçen bir test paketi demek değildir.
|
|
555
|
+
- **Bir doğrulamanın _yanlış_ olduğunu söyleyemez.** `expect(total).toBe(41)` sağlıklı görünür. Mjölnir yanlış şeyi denetleyen testleri değil, _başarısız olamayan_ testleri ve _kırmızıya dönemeyen_ pipeline'ları bulur.
|
|
556
|
+
- **İş doğruluğunu kanıtlamaz.** Buradaki hiçbir şey ürününüzün gereksinimin istediğini yaptığını söylemez.
|
|
557
|
+
- **100, iyi bir test paketinin kanıtı değildir.** Paketinizin gerçek riskinizi kapsayıp kapsamadığı ayrı bir sorudur ve bu araç onu yanıtlamaz.
|
|
558
|
+
- **79 kuraldan 5'i ölçülmüş bir orana değil, bir tahmine dayanır.** Her biri bunu kendi bulgusunda söyler.
|
|
559
|
+
- **E1, E2 değildir.** Sezgisel bulgular okunmaya değerdir, körü körüne uygulanmaya değil.
|
|
560
|
+
- **Boş bir depo `null` alır, asla 100 değil.**
|
|
561
|
+
- **Test bildirimi olmayan `*.spec.ts` adlı bir dosya kapsam sayılmaz.** Tek spec dosyaları import ya da tür içeren (sıfır `it`/`test` çağrısı) bir depo 100 değil, `null` alır.
|
|
641
562
|
|
|
642
|
-
|
|
563
|
+
<br />
|
|
643
564
|
|
|
644
|
-
|
|
645
|
-
| ------------------------------------------------------ | ----------------------------------------------- |
|
|
646
|
-
| [docs/SCORING.md](docs/SCORING.md) | Puan normalizasyonu + kanıt ağırlıklandırma |
|
|
647
|
-
| [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Ölçülmüş yanlış pozitif oranları + yöntem |
|
|
648
|
-
| [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Kural durumları, bastırma, kullanımdan kaldırma |
|
|
649
|
-
| [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF çıktısı + düzenleyici/CI kurulumu |
|
|
650
|
-
| [docs/rules/](docs/rules/) | Üretilmiş kural başına katalog |
|
|
651
|
-
| [CONTRIBUTING.md](CONTRIBUTING.md) | Geliştirme kurulumu + katkı akışı |
|
|
652
|
-
| [CHANGELOG.md](CHANGELOG.md) | Sürüm geçmişi |
|
|
653
|
-
| [SECURITY.md](SECURITY.md) | Güvenlik açığı bildirimi |
|
|
565
|
+
## Belgeler
|
|
654
566
|
|
|
655
|
-
|
|
567
|
+
Belgelerin tamamı <https://sergey-bar.github.io/Mjolnir/> adresindeki sitede.
|
|
656
568
|
|
|
657
|
-
|
|
569
|
+
| Belge | İçeriği |
|
|
570
|
+
| ------------------------------------------------------ | ---------------------------------------------------------------- |
|
|
571
|
+
| [docs/SCORING.md](docs/SCORING.md) | Puan normalleştirme ve kanıt ağırlıklandırma |
|
|
572
|
+
| [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Kanonik sözcük dağarcığı: kavram başına tek sözcük |
|
|
573
|
+
| [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Ölçülmüş yanlış pozitif oranları ve yöntem |
|
|
574
|
+
| [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Kural durumları, düzeyler, bastırma, kullanımdan kaldırma |
|
|
575
|
+
| [docs/VERSIONING.md](docs/VERSIONING.md) | Semver politikası, donmuş yüzeyler, kullanımdan kaldırma döngüsü |
|
|
576
|
+
| [docs/machine-contract.md](docs/machine-contract.md) | Kanonik, makine tarafından okunabilir sonuç |
|
|
577
|
+
| [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF çıktısı ve düzenleyici ya da CI kurulumu |
|
|
578
|
+
| [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: Code Quality raporu, MR tarifi, kapı |
|
|
579
|
+
| [docs/rules/](docs/rules/) | Kural başına üretilmiş katalog |
|
|
580
|
+
| [CONTRIBUTING.md](CONTRIBUTING.md) | Geliştirme ortamı ve katkı iş akışı |
|
|
581
|
+
| [SUPPORT.md](SUPPORT.md) | Nerede sorulur, bildirilir ve yardım alınır |
|
|
582
|
+
| [SECURITY.md](SECURITY.md) | Güvenlik açığı bildirimi |
|
|
583
|
+
| [CHANGELOG.md](CHANGELOG.md) | Sürüm geçmişi |
|
|
658
584
|
|
|
659
|
-
|
|
660
|
-
sözleşmelerdir. TypeScript ve Python en geniş ölçülmüş kapsama sahiptir;
|
|
661
|
-
Java ve C# daha yenidir —
|
|
662
|
-
[katman tablosu](#kural-katmanları-ve-dil-olgunluğu) üzerinden okuyun.
|
|
585
|
+
### Durum
|
|
663
586
|
|
|
664
|
-
|
|
587
|
+
**Sürüm 1.** JSON şeması ve çıkış kodları donmuş sözleşmelerdir. TypeScript ve Python en geniş ölçülmüş kapsama sahiptir. Java ve C# daha yenidir; onları [olgunluk tablosu](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle) üzerinden değerlendirin. Sırada ne olduğu, uydurma tarihler olmadan: [herkese açık yol haritası](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
|
|
665
588
|
|
|
666
|
-
|
|
589
|
+
### Katkıda bulunma
|
|
667
590
|
|
|
668
|
-
Yeni kurallar en kolay ilk katkıdır
|
|
669
|
-
**ve** must-not-fire fixture'larıyla iskeletler (üretilen kural, gerçek
|
|
670
|
-
algılama uygulayana dek fixture'larında kasıtlı olarak başarısız olur —
|
|
671
|
-
bir stub sevk edilemez):
|
|
591
|
+
Yeni kurallar en kolay ilk katkıdır. Tek bir komut, kuralı must-fire **ve** must-not-fire fixture'larıyla birlikte iskelet olarak oluşturur. Üretilen kural, gerçek tespit yazılana kadar kendi fixture'larında bilerek başarısız olur; çünkü yayımlanan bir taslak, kimsenin ölçmediği bir kuraldır:
|
|
672
592
|
|
|
673
593
|
```bash
|
|
674
594
|
mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
|
|
675
595
|
```
|
|
676
596
|
|
|
677
|
-
|
|
678
|
-
fixture duvarı yasaları [CONTRIBUTING.md](CONTRIBUTING.md) içindedir.
|
|
597
|
+
Geliştirme ortamı, kalıcı kapı komutları ve anti-creep ile fixture güvenlik duvarı yasaları [CONTRIBUTING.md](CONTRIBUTING.md) içindedir.
|
|
679
598
|
|
|
680
|
-
|
|
599
|
+
<br />
|
|
681
600
|
|
|
682
601
|
<div align="center">
|
|
683
602
|
|
|
684
|
-
|
|
603
|
+
<img src="assets/readme/closing.svg" alt="Deponuzda çalıştırın." width="100%" />
|
|
685
604
|
|
|
686
605
|
```bash
|
|
687
606
|
npx mjolnir-qa@latest
|
|
688
607
|
```
|
|
689
608
|
|
|
690
|
-
|
|
609
|
+
[Rehberi okuyun](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Belge sitesi](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
|
|
610
|
+
|
|
611
|
+
<br />
|
|
612
|
+
|
|
613
|
+
Testlerin geçip geçmediğini sormayın.<br />
|
|
614
|
+
Kanıtın, onların güveni hak ettiğini kanıtlayıp kanıtlamadığını sorun.
|
|
691
615
|
|
|
692
|
-
[Sergey Bar](https://www.linkedin.com/in/sergeybar/) tarafından
|
|
693
|
-
oluşturuldu
|
|
616
|
+
<sub>[Sergey Bar](https://www.linkedin.com/in/sergeybar/) tarafından geliştirildi · MIT lisanslı</sub>
|
|
694
617
|
|
|
695
618
|
</div>
|