mjolnir-qa 5.0.0 → 6.0.0

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.bs.md DELETED
@@ -1,647 +0,0 @@
1
- <div align="center">
2
-
3
- <img src="assets/readme/hero.svg" alt="Mjölnir. Testovi vam govore šta je prošlo. Mjölnir vam govori čemu možete vjerovati." width="100%" />
4
-
5
- <br />
6
-
7
- Mjölnir pronalazi testove koji ne mogu pasti i pipelineove koji ne mogu postati crveni,<br />
8
- a zatim ocjenjuje koliko se rezultatu može vjerovati, uz dokaz za svaki bod.
9
-
10
- <br />
11
-
12
- [![npm](https://img.shields.io/npm/v/mjolnir-qa.svg?style=flat-square&color=1F6F7C&labelColor=0A1119)](https://www.npmjs.com/package/mjolnir-qa)
13
- [![downloads](https://img.shields.io/npm/dm/mjolnir-qa.svg?style=flat-square&color=1F6F7C&labelColor=0A1119)](https://www.npmjs.com/package/mjolnir-qa)
14
- [![ci](https://img.shields.io/github/actions/workflow/status/Sergey-Bar/Mjolnir/ci.yml?branch=main&style=flat-square&label=ci&labelColor=0A1119)](https://github.com/Sergey-Bar/Mjolnir/actions/workflows/ci.yml)
15
- [![coverage](https://img.shields.io/codecov/c/github/Sergey-Bar/Mjolnir?style=flat-square&color=1F6F7C&labelColor=0A1119&label=coverage)](https://codecov.io/gh/Sergey-Bar/Mjolnir)
16
- [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Sergey-Bar/Mjolnir/badge)](https://scorecard.dev/viewer/?uri=github.com/Sergey-Bar/Mjolnir)
17
- [![license](https://img.shields.io/badge/license-MIT-1F6F7C.svg?style=flat-square&labelColor=0A1119)](LICENSE)
18
- [![node](https://img.shields.io/badge/node-%E2%89%A5%2022.18-1F6F7C.svg?style=flat-square&labelColor=0A1119)](https://nodejs.org)
19
-
20
- ```bash
21
- npx mjolnir-qa@3.0.0
22
- ```
23
-
24
- [Pogledajte kako radi](#pogledajte-kako-radi) · [Brzi početak](#brzi-početak) · [Šta pronalazi](#šta-mjölnir-pronalazi) · [Ocjena](#ocjena-vrijednosti) · [Dokazi](#model-dokaza) · [Analiza pokretanja](#analiza-pokretanja-testova) · [CI](#integritet-ci-ja) · [Agenti](#ai-agenti) · [Sigurnost](#povjerenje-i-sigurnost) · [Ograničenja](#šta-vam-mjölnir-ne-može-reći) · [Dokumentacija](#dokumentacija)
25
-
26
- <details>
27
- <summary>Čitajte na drugom jeziku — 22 prijevoda</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.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
30
-
31
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-26.
32
-
33
- <!-- Source hash: `de04dfb1677b` -->
34
-
35
- </details>
36
-
37
- </div>
38
-
39
- <br />
40
-
41
- ## Release status (English canonical)
42
-
43
- The published line is `3.0.0`; this working tree is the `4.0.0-rc.1`
44
- candidate. `3.0.0` must not be republished or retagged. The M26–M50 program is
45
- tracked in
46
- [`docs/ROADMAP.yaml`](docs/ROADMAP.yaml); provisional capability contracts
47
- are not automatically enabled or certified. Repository-owned checks pass, but
48
- Trust certification remains `NOT_CERTIFIED` until the protected holdout,
49
- real-world, platform/consumer, remote-workflow, support-matrix, and corpus
50
- evidence gates pass. Run `npm run m26:readiness` before treating any candidate
51
- as releasable. This document does not publish a tag or authorize a release.
52
-
53
- > Machine-assisted canonical text. Translate this block before treating it as localized copy.
54
-
55
- ## Zelena kvačica je tvrdnja, a ne dokaz
56
-
57
- Zelena kvačica znači da pipeline nije pao. Ne znači da su se testovi izvršili, niti da su mogli pasti. Svaki od ovih slučajeva prolazi zeleno:
58
-
59
- - commitovani `.only` koji je pokrenuo 3 testa umjesto 900
60
- - `continue-on-error: true` na jobu koji je trebao blokirati
61
- - `|| true` nakon naredbe za testove
62
- - test koji ništa ne provjerava ili ima prazno tijelo
63
- - retry omotač koji pravi pad pretvara u sretan prolaz
64
- - izvještaj koji workflow otprema, a nikad ga nije generisao
65
- - fiksni sleep koji drži na okupu race condition
66
-
67
- Nijedan od njih ne boji pipeline u crveno, a svaki na reviewu izgleda namjerno. Zato i opstaju. Evo kako Mjölnir čita stvaran primjer:
68
-
69
- <p align="center">
70
- <img src="assets/readme/scan.svg" alt="CI workflow demo repozitorija, pročitan red po red. Mjölnir označava svaki nalaz u redu u kojem ga je prijavio, s pravilom, onim što nije u redu, nivoom dokaza i izmjerenom stopom lažno pozitivnih rezultata." width="800" />
71
- </p>
72
-
73
- <sub>Svaki nalaz koji je demo skeniranje prijavilo za ovaj workflow, u redu u kojem je prijavljen. Generisano naredbom `npm run docs:readme-brand` iz [`demo-report.json`](assets/readme/demo-report.json) i zaključano protiv odstupanja u CI-ju.</sub>
74
-
75
- **Strogi režim.** Najagresivnija otkrivanja — `.only`, `continue-on-error`, prazni testovi, zloupotreba ponavljanja — žive u karantinskom nivou. Rade samo pod `--strict` i ograničena su na `info` ozbiljnost: označavaju, ali nikada ne blokiraju. Podrazumijevano skeniranje (`npx mjolnir-qa@3.0.0` bez `--strict`) pokriva samo osnovna i proširena pravila. Dodajte `--strict` kada želite i savjetodavni sloj.
76
-
77
- Mjölnir čita skup testova, CI workflowe i, ako ga imate, izvještaj stvarnog pokretanja. Ne pokreće vaše testove, ne instalira vaše zavisnosti i ne izvršava kod koji skenira. A kada nema dokaza, to i kaže umjesto da izmišlja pouzdanost:
78
-
79
- | Situacija | Šta Mjölnir prijavljuje |
80
- | ------------------------------------------------------------ | ---------------------------------------------------------------- |
81
- | Nisu pronađene deklaracije testova | Ocjena `null`, prikazana kao **UNKNOWN**. Nikad izmišljenih 100. |
82
- | Nema baselinea ni uporedive revizije | **UNKNOWN**, uz naveden razlog. Nikad pretpostavljena 0. |
83
- | Skeniranje prekinuto (vremenski budžet, nečitljive datoteke) | **PARTIAL**, izlaz `2`. Nikad se ne prikazuje kao čisto. |
84
-
85
- <p align="center">
86
- <img src="assets/readme/how-it-works.svg" alt="Kako Mjölnir radi. Statički čita skup testova i CI pipeline, kao i izvještaj stvarnog pokretanja kada postoji. Svaki nalaz vaga prema nivou dokaza i nivou povjerenja, pri čemu samo stvarno pokretanje može dosegnuti L3 do L5, i daje nalaze, ocjenu vrijednosti i CI kapiju sa zamrznutim izlaznim kodovima. U petlji agenta, AI piše ispravku, a Mjölnir ponovo skenira da je dokaže." width="880" />
87
- </p>
88
-
89
- <sub>Napravljeno za ovu stranicu i prikazano u omjeru 1:1. Generisano naredbom `npm run docs:readme-brand` i zaključano protiv odstupanja u CI-ju; ocjena, brojevi i ID pravila dolaze iz [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) i registra pravila, nikad se ne kucaju ručno. Ista slika kao poster: [`architecture.svg`](assets/readme/architecture.svg).</sub>
90
-
91
- <br />
92
-
93
- ## Pogledajte kako radi
94
-
95
- Stvarno skeniranje [`examples/demo-repo`](examples/demo-repo), malog Playwright skupa testova s CI workflowom. Evo gdje su otišli njegovi bodovi:
96
-
97
- <p align="center">
98
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnirov pregled odbitaka: WORTHINESS 80/100 WORTHY, ocjena po kategoriji, okvir odbitaka po ozbiljnosti i lista FIX THIS FIRST" width="520" />
99
- </p>
100
-
101
- <sub>Generisano naredbom `npm run docs:hero` iz stvarnog skeniranja i zaključano protiv odstupanja u CI-ju. Puni `--verbose` izvještaj istog skeniranja je [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
102
-
103
- <details>
104
- <summary><strong>Pogledajte</strong> — skeniranje, ispravka koju ispisuje i ponovno skeniranje koje je dokazuje</summary>
105
-
106
- <br />
107
-
108
- <p align="center">
109
- <a href="assets/video/mjolnir-demo.mp4">
110
- <img src="assets/video/mjolnir-demo-poster.png" alt="Kadar demo snimka: npx mjolnir-qa@3.0.0 skenira demo repozitorij u prozoru terminala" width="900" />
111
- </a>
112
- </p>
113
-
114
- <sub>Renderovano kadar po kadar iz stvarnog skeniranja naredbom `npm run docs:video`; nikad snimljeno sa ekrana. Odaberite kadar da otvorite [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4).</sub>
115
-
116
- </details>
117
-
118
- ### Jedan nalaz izbliza
119
-
120
- Svaki nalaz odgovara na četiri pitanja: gdje je, koliko je Mjölnir siguran, koliko često pravilo griješi i kako ga ispraviti.
121
-
122
- <p align="center">
123
- <img src="assets/readme/finding-anatomy.svg" alt="Prvi nalaz demo skeniranja, tačno onako kako ga terminal ispisuje, s označena četiri dijela: gdje, koliko sigurno, koliko često pravilo griješi, i ispravka." width="100%" />
124
- </p>
125
-
126
- `mjolnir explain QA-CI-001` ispisuje cijeli zapis povjerenja pravila, uključujući izmjerenu stopu lažno pozitivnih rezultata i nivo koji mu je ta stopa donijela:
127
-
128
- ```text
129
- ▍ QA-CI-001 — continue-on-error masks a failing verification gate
130
-
131
- Severity: error
132
- Confidence: high
133
- Tier: quarantine
134
- Evidence: E2
135
- QA impact: False-green risk (FALSE-GREEN)
136
- Measured FP: 11% (19 hand-classified corpus verdicts)
137
- FP risk: low (author estimate)
138
- Languages: yaml
139
- Frameworks: github-actions, azure-pipelines
140
-
141
- WHAT WAS FOUND (real detector output, not a mockup)
142
- Job `security-scan` runs a verification gate under `continue-on-error: true`.
143
-
144
- WHY IT MATTERS
145
- This job can fail every day and CI will still show green. The checkmark on
146
- this workflow cannot be trusted.
147
-
148
- HOW TO FIX
149
- Remove continue-on-error, or scope it to individual non-blocking steps only.
150
-
151
- Example from this rule's own must-fire fixture: QA-CI-001/must-fire/masked.yml
152
-
153
- WHAT WOULD CHANGE THE VERDICT
154
- - a run report next to the scan target (mjolnir.report.json or test-results/)
155
- corroborating this file lifts its findings to L3–L5
156
- - a documented suppression (mjolnir.config.json) lowers the finding count
157
- without claiming correctness
158
- - quarantine findings run only under --strict and are advisory (E0) — they can
159
- never gate CI
160
-
161
- NEXT ACTION
162
- Fix the first occurrence, then re-run: `mjolnir --scope changed`. Every
163
- occurrence of this rule is listed in the scan output.
164
-
165
- HOW TO VERIFY THE FIX
166
- Re-run `mjolnir` on the changed file(s) — this finding should no longer
167
- appear. `mjolnir --scope changed` scopes the check to just what you touched.
168
-
169
- Docs: mjolnir rules --md (full catalog, this rule included)
170
- ```
171
-
172
- To je jedinica vrijednosti: jedno mjesto na kojem CI prijavljuje prolaz koji nije zaslužio.
173
-
174
- <br />
175
-
176
- ## Brzi početak
177
-
178
- ```bash
179
- npx mjolnir-qa@3.0.0
180
- ```
181
-
182
- Skenira trenutni direktorij i ispisuje Trust Report: šta je pronašao, koliko mu možete vjerovati, zašto i šta dalje uraditi. Završava s `0` kada ništa na nivou kapije ili iznad nije pronađeno.
183
-
184
- U CI-ju skenirajte samo ono što je grana uvela, kako stari skup testova ne bi potopio vaš prvi pull request:
185
-
186
- ```bash
187
- npx mjolnir-qa@3.0.0 --scope changed
188
- ```
189
-
190
- `mjolnir ci install` to zapisuje kao GitHub Actions workflow, koristeći [action](https://github.com/Sergey-Bar/Mjolnir#readme) prikovan za glavni tag `v3` (ili obični `npx` s `--no-action`). Ostaje savjetodavan dok ne odlučite da treba blokirati.
191
-
192
- | Naredba | Šta radi |
193
- | --------------------------------------------- | ------------------------------------------------------- |
194
- | `mjolnir` | Trust Report: presuda, pouzdanost, sljedeći korak |
195
- | `mjolnir --scope changed` | Samo ono što je vaša grana uvela (CI oblik) |
196
- | `mjolnir ci install` | Generiše savjetodavni PR workflow (zasnovan na actionu) |
197
- | `mjolnir business-case` | ROI estimate: projected savings per finding |
198
- | `mjolnir release-report` | Release readiness: GO, CONDITIONAL GO, or NO-GO |
199
- | `mjolnir release-trust` | 12-dimension release assurance verdict |
200
- | `mjolnir report` | Generate a Playwright-compatible report |
201
- | `mjolnir trend` | Record, show, or diff local quality snapshots |
202
- | `mjolnir policy` | Initialize, validate, or check policy gates |
203
- | `mjolnir quarantine` | Review deterministic proposals (prototype) |
204
- | `mjolnir analyze --cross-file` | Bounded cross-file analysis |
205
- | `mjolnir ci-adapter github .` | Generate CI templates for supported providers |
206
- | `mjolnir dashboard` | Generate a self-contained quality dashboard |
207
- | `mjolnir exec-report` | Executive KPIs and recommendations (advisory) |
208
- | `mjolnir enterprise` | Self-hosted templates (prototype) |
209
- | `mjolnir maturity` | Assess maturity or display maturity levels |
210
- | `mjolnir mutation tests/mutation-report.json` | Analyze mutation reports; never promotes trust |
211
- | `mjolnir mcp` | Read-only MCP tools over stdio |
212
- | `mjolnir explain QA-CI-001` | Šta, zašto i ispravka, plus izmjerena FP stopa |
213
- | `mjolnir why src/a.spec.ts:42` | Zašto je baš ovaj red označen. Nikad ne blokira. |
214
- | `mjolnir forensics ./test-results/` | Dokazi iz stvarnog pokretanja |
215
- | `mjolnir trust-report` | Samostalni Trust Artifact (md + json) |
216
- | `mjolnir handoff` | Plan sanacije za agenta za kodiranje |
217
- | `mjolnir --json` / `--format sarif` | Mašinski čitljiv izlaz, GitHub Code Scanning |
218
- | `mjolnir --format codequality` | GitLab Code Quality izvještaj (artefakt MR widgeta) |
219
- | `mjolnir --strict` | Pokreće i pravila nivoa quarantine (veći FP rizik) |
220
-
221
- <details>
222
- <summary><strong>Sve ostale naredbe</strong> — trijaža nestabilnih testova, izvještavanje, upravljanje</summary>
223
-
224
- <br />
225
-
226
- | Naredba | Šta radi |
227
- | ----------------------------------- | ------------------------------------------------------------------------------ |
228
- | `mjolnir --classic` | Baner ocjene iz vremena prije Trust Reporta |
229
- | `mjolnir explain verdict` | Zašto je presuda sačuvanog skeniranja takva kakva jeste |
230
- | `mjolnir triage ./test-results/` | Vođena trijaža. Svaki red završava sljedećim korakom. |
231
- | `mjolnir pw-report ./test-results/` | Sažetak Playwright pokretanja: ponavljanja, nestabilni testovi, najsporiji |
232
- | `mjolnir doctor:playwright` | Dubinsko skeniranje samo za Playwright plus Selector Health Score |
233
- | `mjolnir fix --dry-run` / `fix` | Sigurne automatske ispravke, svaka ponovo skenirana da se dokaže da je uspjela |
234
- | `mjolnir baseline` / `diff` | Snimak nalaza, a zatim prijava samo novih ili gorih |
235
- | `mjolnir impact --since <ref>` | Šta je commit uveo i riješio |
236
- | `mjolnir summary` | CI anotacije i sažetak koraka iz izvještaja |
237
- | `mjolnir pr-comment` | Ciljani PR komentar, u Markdownu |
238
- | `mjolnir debt` | Registar testnog duga s modelom troškova |
239
- | `mjolnir handover` | Mapa skupa testova za novog QA inženjera |
240
- | `mjolnir init` | Otkriva frameworke, ispisuje listu za podešavanje |
241
- | `mjolnir suppressions` | Prikazuje utišane nalaze, radi upravljanja |
242
- | `mjolnir rules --unmeasured` | Pravila koja rade na pretpostavci, a ne na mjerenju |
243
- | `mjolnir rules --md` | Kompletan katalog pravila (JSON ili Markdown) |
244
- | `mjolnir doctor` | Samorevizija Mjölnirove vlastite baze pravila |
245
- | `mjolnir create-rule <ID>` | Pravi kostur novog pravila i njegovih fixturea |
246
- | `mjolnir stats` | Lokalni brojači svih viđenih ispravki |
247
- | `mjolnir badge` | JSON za shields.io endpoint i isječak koda |
248
- | `mjolnir --cache` | Inkrementalna ponovna skeniranja preko lokalnog keša presuda |
249
- | `mjolnir --format mermaid` | Dijagram arhitekture testova za PR komentar |
250
-
251
- `mjolnir help <command>` ispisuje upotrebu, primjere i sljedeći korak za svaku od njih.
252
-
253
- </details>
254
-
255
- Zahtijeva **Node.js ≥ 22.18** na Windowsu, macOS-u ili Linuxu. Više volite globalnu instalaciju? `npm i -g mjolnir-qa`. Minimum dolazi iz lanca alata za build (tsdown cilja na njega, a pipeline izdanja radi smoke testove na njemu); zavisnostima za izvršavanje ne treba više od toga.
256
-
257
- <br />
258
-
259
- ## Šta Mjölnir pronalazi
260
-
261
- <p align="center">
262
- <img src="assets/readme/stack.svg" alt="Radi s vašim stackom: jezici, test frameworci i CI sistemi koje pokrivaju njegova pravila, prema registru pravila." width="100%" />
263
- </p>
264
-
265
- **79 pravila** u četiri porodice — higijena testova, kvalitet testova, Playwright i integritet CI-ja — za TypeScript i JavaScript, Python, Javu, C# i GitHub Actions YAML. Pokrivaju Playwright u sva četiri bindinga, plus pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest i Mochu, s početnom pokrivenošću za Cypress i Selenium. Devet od njih, da se vidi oblik:
266
-
267
- | ID | Pravilo | Ozbiljnost | Nivo |
268
- | ------------ | -------------------------------------------------------------------- | ---------- | ---------- |
269
- | QA-CI-001 | `continue-on-error` maskira kapiju verifikacije koja pada | error | quarantine |
270
- | QA-CI-009 | Izlazni kod testova se ne prosljeđuje (`\|` bez pipefail, `;` lanci) | error | extended |
271
- | QA-TEST-001 | Commitovan fokusirani test (`.only`, `fit`) | error | quarantine |
272
- | QA-TEST-003 | Test bez asercija | error | quarantine |
273
- | QA-TQUAL-009 | Asercija na promise bez await | error | quarantine |
274
- | QA-PW-002 | Asercija na lokatoru bez await | error | core |
275
- | QA-PW-004 | Krhki CSS/XPath selektori | warning | quarantine |
276
- | QA-PY-002 | Preskočen test (`skip`, nestriktni `xfail`) | warning | core |
277
- | QA-CS-103 | Testna metoda bez asercija | error | core |
278
-
279
- Kompletan katalog se generiše iz registra, nikad se ne održava ručno: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) ili [vodič o tome šta provjerava](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
280
-
281
- <details>
282
- <summary><strong>Svako pravilo navedeno u ovom README-u</strong>, u jednoj tabeli</summary>
283
-
284
- <br />
285
-
286
- > Pravila `quarantine` se pokreću samo uz `--strict` i nikad ne blokiraju (ograničena su na info). Prikazana ozbiljnost je ona koju je odredio autor.
287
-
288
- | ID | Porodica | Pravilo | Ozbiljnost | Nivo |
289
- | ------------ | ---------- | ------------------------------------------------------------ | ---------- | ---------- |
290
- | QA-TEST-001 | Higijena | Commitovan fokusirani test (`.only`, `fit`) | error | quarantine |
291
- | QA-TEST-002 | Higijena | Preskočen test. Bez praćenog razloga eskalira na `error`. | warning | quarantine |
292
- | QA-TEST-003 | Higijena | Test bez asercija | error | quarantine |
293
- | QA-TEST-004 | Higijena | Fiksni sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
294
- | QA-TEST-006 | Higijena | Zloupotreba ponavljanja koja skriva nestabilnost | warning | quarantine |
295
- | QA-TEST-010 | Higijena | Prazno tijelo testa | error | quarantine |
296
- | QA-TQUAL-002 | Kvalitet | Tautološka asercija | error | quarantine |
297
- | QA-TQUAL-009 | Kvalitet | Asercija na promise bez await | error | quarantine |
298
- | QA-TQUAL-011 | Kvalitet | Zakomentarisani testovi | warning | extended |
299
- | QA-PW-002 | Playwright | Asercija na lokatoru bez await | error | core |
300
- | QA-PW-003 | Playwright | Commitovani `page.pause()` / `test.only()` | error | core |
301
- | QA-PW-004 | Playwright | Krhki CSS/XPath selektori | warning | quarantine |
302
- | QA-PW-123 | Playwright | Hardkodirani URL-ovi okruženja | warning | quarantine |
303
- | QA-PW-140 | Playwright | Snimak ekrana bez `maxDiffPixelRatio` | warning | core |
304
- | QA-CI-001 | CI | `continue-on-error` maskira kapiju koja pada | error | quarantine |
305
- | QA-CI-002 | CI | `\|\| true` guta izlazne kodove | error | extended |
306
- | QA-CI-005 | CI | Izvještaj se koristi, ali se nikad ne generiše | error | quarantine |
307
- | QA-CI-007 | CI | Retry omotači oko testova | warning | extended |
308
- | QA-CI-008 | CI | Korak koji uvijek uspijeva maskira padove | error | quarantine |
309
- | QA-CI-009 | CI | Izlazni kod se ne prosljeđuje (`\|` bez pipefail, `;` lanci) | error | extended |
310
- | QA-CI-010 | CI | Testovi preskočeni tamo gdje moraju blokirati | error | quarantine |
311
- | QA-PY-002 | Python | Preskočen test (`skip`, nestriktni `xfail`) | warning | core |
312
- | QA-PY-003 | Python | Testna funkcija bez asercija | error | quarantine |
313
- | QA-PY-005 | Python | `time.sleep()` u testovima | warning | extended |
314
- | QA-PY-012 | Python | Tautološka asercija | error | quarantine |
315
- | QA-JV-101 | Java | Onemogućen test (`@Disabled`) | warning | core |
316
- | QA-JV-102 | Java | Fiksni sleep (`Thread.sleep()`) | warning | extended |
317
- | QA-JV-103 | Java | Testna metoda bez asercija | error | extended |
318
- | QA-JV-105 | Java | Fiksni sleep preko Playwright `waitForTimeout()` | warning | core |
319
- | QA-JV-106 | Java | Krhki selektor umjesto lokatora zasnovanog na ulozi | warning | quarantine |
320
- | QA-CS-101 | C# | Preskočen test (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
321
- | QA-CS-102 | C# | Fiksni sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
322
- | QA-CS-103 | C# | Testna metoda bez asercija | error | core |
323
- | QA-CS-105 | C# | Fiksni sleep preko `WaitForTimeoutAsync()` | warning | extended |
324
- | QA-CS-106 | C# | Krhki selektor umjesto lokatora zasnovanog na ulozi | warning | quarantine |
325
-
326
- Python dolazi i s pravilima QA-PY-001…012 (higijena pytesta) i QA-PY-101…108 (Playwright za Python). Cypress i Selenium imaju početne skupove od po tri pravila.
327
-
328
- </details>
329
-
330
- Svako pravilo se isporučuje s must-fire **i** must-not-fire fixtureom, a pravilo koje se okine na vlastitom negativnom fixtureu ne može biti isporučeno. To je zaštitni zid od lažno pozitivnih rezultata; `mjolnir doctor` ga provodi u vlastitom CI-ju ovog repozitorija.
331
-
332
- ### Selector Health Score
333
-
334
- `mjolnir doctor:playwright` ocjenjuje svaki lokator prema tome kako pronalazi element: onako kako bi to uradio korisnik (uloga, oznaka, tekst), preko eksplicitnog ugovora (`data-testid`) ili strukturnom slučajnošću (CSS lanci, XPath). Svaka datoteka dobija ocjenu od 0 do 100:
335
-
336
- ```text
337
- ▍ SELECTOR HEALTH
338
-
339
- e2e/login.spec.ts
340
- [█████████████░░░░░░░] 65 / 100
341
- role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
342
-
343
- e2e/checkout.spec.ts
344
- [██████████████████░░] 88 / 100
345
- role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
346
- ```
347
-
348
- Ovo mjeri **otpornost, a ne ispravnost**. `.btn.btn-primary > div:nth-child(2)` prolazi danas i nastavlja prolaziti dok neko ne dirne markup. Niska ocjena nikad ne tvrdi da je test pokvaren, samo da zavisi od markupa koji niko nije obećao sačuvati.
349
-
350
- <br />
351
-
352
- ## Ocjena vrijednosti
353
-
354
- <p align="center">
355
- <img src="assets/readme/score-gauge.svg" alt="Skala vrijednosti od 0 do 100, s markerom koji prelazi svaku ocjenu: UNWORTHY ispod 50, NEEDS WORK od 50 do 79, WORTHY od 80 do 99, FORGED na 100" width="720" />
356
- </p>
357
-
358
- <sub>Svaka ocjena od 0 do 100, postavljena stvarnim `deriveScoreState`. Generisano naredbom `npm run docs:gauge` i zaključano protiv odstupanja u CI-ju.</sub>
359
-
360
- | Ocjena | Presuda |
361
- | --------- | ----------------------------------------------- |
362
- | `0 – 49` | **UNWORTHY** |
363
- | `50 – 79` | **NEEDS WORK** |
364
- | `80 – 99` | **WORTHY** |
365
- | `100` | **FORGED** |
366
- | `null` | **UNKNOWN**: nisu pronađene deklaracije testova |
367
-
368
- **Kako se računa.** Ozbiljnost određuje osnovni odbitak (`error −8`, `warning −3`, `info −1`), a nivo dokaza ga umanjuje: E2 se računa u potpunosti, E1 upola (zaokruženo nadolje), E0 nikako. Zbir se normalizuje prema izloženosti skupa testova, odnosno odbici po deklaraciji testa umjesto po datoteci. Terminal ispisuje iste umanjene brojeve koje je ocjena koristila; nema skrivenog drugog modela. Detalji: [docs/SCORING.md](docs/SCORING.md) i [vodič za ocjenjivanje](https://sergey-bar.github.io/Mjolnir/guide/scoring).
369
-
370
- **Šta 100 ne znači.** Ne znači da je softver ispravan, da je skup testova dovoljan ili da je proizvod bez grešaka. Znači jednu stvar: **nijedno od pravila koja je Mjölnir procijenio nije proizvelo odbitak u ovom skeniranju i ovom modelu dokaza.**
371
-
372
- <br />
373
-
374
- ## Model dokaza
375
-
376
- Svaki nalaz nosi dvije oznake: koliko je Mjölnir siguran i koliko je daleko nalaz provjeren. To je razlika između alata koji prijavljuje obrasce i alata od kojeg možete uslovljavati izdanje.
377
-
378
- **Koliko sigurno — nivo dokaza.**
379
-
380
- | Nivo | Naziv | Znači | Odbitak |
381
- | ------ | --------------------- | -------------------------------------------------- | ------- |
382
- | **E2** | Deterministički dokaz | Defekt je prisutan u kodu onakvom kakav je napisan | Pun |
383
- | **E1** | Dokaz iz obrasca | Poklopio se obrazac usko povezan s defektom | Pola |
384
- | **E0** | Zapažanje | Vrijedi znati. Nije tvrdnja da nešto nije u redu. | Nula |
385
-
386
- Pouzdanost detekcije nije snaga dokaza. Pravilo može biti sigurno da je pronašlo ono što je tražilo, a ipak gledati heuristiku. E1 nalazi su tu da se čitaju i procjenjuju, nikad da se primjenjuju naslijepo, i ta granica je utisnuta na nalaz u terminalu, u JSON-u i u predaji agentu.
387
-
388
- **Koliko daleko je provjereno — nivo povjerenja.** Većina nalaza dolazi iz čitanja vašeg koda. Dajte Mjölniru izvještaj stvarnog pokretanja testova i on može potvrditi da se kod zaista izvršio.
389
-
390
- <p align="center">
391
- <img src="assets/readme/trust-ladder.svg" alt="Ljestvica povjerenja od L0 do L5. L0 do L2 dolaze iz čitanja koda; L3 do L5 zahtijevaju izvještaj stvarnog pokretanja, što je označeno prekidom na ljestvici." width="100%" />
392
- </p>
393
-
394
- | Nivo | Jednostavnim riječima | Šta je potrebno |
395
- | ------ | --------------------- | ------------------------------------------------------------ |
396
- | **L0** | Zabilježeno | Čitanje koda |
397
- | **L1** | Liči na problem | Čitanje koda: poklopio se obrazac |
398
- | **L2** | Dokazano u kodu | Čitanje koda: defekt je strukturni |
399
- | **L3** | Datoteka se izvršila | Izvještaj pokretanja pokazuje da je datoteka nalaza izvršena |
400
- | **L4** | Test se izvršio | Izvještaj pokretanja pokazuje da je test nalaza izvršen |
401
- | **L5** | Pokretanje se slaže | Vlastiti rezultat pokretanja potvrđuje klasu defekta |
402
-
403
- Statičko skeniranje staje na L2. Samo izvještaj stvarnog pokretanja (Playwright JSON, Jest ili Vitest JSON, JUnit XML) može podići nalaz na L3 ili više, pa nalaz koji nikad nije viđen u izvršavanju nikad ne može tvrditi da jeste. Definicije: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
404
-
405
- ### Koliko je od ovoga izmjereno
406
-
407
- **74 od 79 pravila imaju stopu lažno pozitivnih rezultata izmjerenu na stvarnom OSS kodu** (najmanje 10 ručno klasifikovanih nalaza za svako; pogledajte [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Ostalih 5 se isporučuje na autorovoj procjeni i to kaže, pravilo po pravilo, u `mjolnir explain`. `mjolnir rules --unmeasured` ih navodi, a podnožje svakog skeniranja prijavljuje koliko je izmjereno od pravila koja su se zaista _okinula_.
408
-
409
- Stope ostaju javne i kada su loše. QA-TEST-001 (commitovani `.only`) loše prolazi reviziju na stvarnim repozitorijima i zato je u quarantine. Aktuelni broj za svako pravilo, uključujući QA-PW-141, nalazi se u reviziji.
410
-
411
- ### Nivoi povjerenja pravila
412
-
413
- Nivoi prate izmjerenu stopu lažno pozitivnih rezultata, a ne mišljenje:
414
-
415
- | Nivo | Izmjereni FP | Ponašanje |
416
- | -------------- | --------------------------------- | ----------------------------------------------------- |
417
- | **core** | ≤ 10% | Zadani izvještaj, blokira |
418
- | **extended** | ≤ 30% | Zadani izvještaj, niža pouzdanost |
419
- | **quarantine** | > 30% ili eksplicitno deklarisano | Samo `--strict`, ograničeno na info, nikad ne blokira |
420
- | _neizmjereno_ | n < 10 | Ne može se unaprijediti u core dok se ne izmjeri |
421
-
422
- FP opsezi mogu samo degradirati nivo — nikad ne unapređuju pravilo iz `quarantine` ako je tamo eksplicitno deklarisano. Eksplicitno karantinirano pravilo ostaje u quarantine bez obzira na izmjerenu FP stopu.
423
-
424
- Unapređenje, degradacija i zrelost po jeziku: [životni ciklus pravila](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
425
-
426
- ### Zašto ovo nije linter
427
-
428
- Linteri vam govore da li kod poštuje pravila. Mjölnir vam govori može li se vjerovati vašoj verifikaciji.
429
-
430
- | | Linteri (ESLint, SonarQube) | Alati za pokrivenost | AI pregled koda | **Mjölnir** |
431
- | ---------------------------------------------------------------- | :-------------------------: | :------------------: | :-------------: | :----------------: |
432
- | Ocjenjuje **sistem verifikacije**, a ne kod proizvoda | Ne | Ne | Ne | Da |
433
- | Integritet CI workflowa (`continue-on-error`, `\|\| true`) | Ne | Ne | samo diff | Da |
434
- | Ocjenjuje otpornost Playwright lokatora (Selector Health) | Ne | Ne | Ne | Da |
435
- | Čita stvarne podatke pokretanja za `TRUE-FLAKE` presude | Ne | Ne | Ne | Da |
436
- | Objavljuje izmjerenu stopu lažno pozitivnih rezultata po pravilu | Ne | Ne | Ne | Da |
437
- | Označava testove bez asercija | Da\* | Ne | ponekad | Da |
438
- | Hvata fiksne sleepove (`waitForTimeout`, `time.sleep`) | Da\* | Ne | ponekad | Da |
439
- | Deterministički (isti ulaz, isti izlaz) | Da | Da | Ne | Da |
440
- | Trošak po skeniranju | besplatno | besplatno | tokeni | **nula** (lokalno) |
441
-
442
- <sub>\*Pokriveno s `eslint-plugin-jest` i `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) te vlastitim pravilima za asercije u SonarQubeu. Kolone opisuju zadano ponašanje za verifikaciju skupova testova; dodaci, plaćeni paketi i prilagođena pravila mijenjaju neke odgovore. Ovo je sažetak pozicioniranja, a ne benchmark.</sub>
443
-
444
- Koristite i AI pregled. Hvata nijanse, namjeru i greške u dizajnu koje nijedan obrazac ne može pronaći. Mjölnir hvata ono što AI pregled previdi jer izgleda namjerno: commitovani `.only`, progutan izlazni kod, `continue-on-error` na test jobu. Za to treba skeniranje, a ne rasuđivanje.
445
-
446
- <br />
447
-
448
- ## Analiza pokretanja testova
449
-
450
- Statička analiza rasuđuje o kodu koji se nikad nije izvršio. Analiza pokretanja čita šta se zaista dogodilo: Playwright JSON, Jest JSON, Vitest JSON i JUnit XML iz bilo kojeg runnera.
451
-
452
- ```bash
453
- mjolnir forensics ./test-results/
454
- ```
455
-
456
- ```text
457
- ▍ FLAKINESS LEADERBOARD
458
-
459
- 3 tests · 1 failed · 1 flaky · 1 retried
460
-
461
- TRUE-FLAKE completes checkout with saved card (e2e/checkout.spec.ts)
462
- ████████████████████ 6.0s · 2 attempts
463
- FAILING declines an expired card (e2e/checkout.spec.ts)
464
- ████░░░░░░░░░░░░░░░░ 1.1s · 1 attempt
465
- ```
466
-
467
- `TRUE-FLAKE` ne znači da je test ponovljen. Znači da je test **pao barem u jednom pokušaju, a zatim završio zeleno**: sretan prolaz, označen bez obzira na to šta kaže konačna kvačica. `mjolnir triage` tu historiju pretvara u prijedlog karantina, a `mjolnir pw-report` sažima pokretanje. Upravo ti izvještaji pokretanja podižu nalaze na nivoe povjerenja L3 i više.
468
-
469
- <br />
470
-
471
- ## Integritet CI-ja
472
-
473
- Test može prolaziti dok pipeline oko njega ne može pasti. Mjölnir čita i workflowe: `continue-on-error`, `|| true`, izlazne kodove koji se nikad ne prosljeđuju, korake koji uvijek uspijevaju, izvještaje koji se koriste, a nikad ne generišu, i kapije preskočene baš na događajima koji bi trebali blokirati. Svaki nalaz navodi job, korak i red, i nosi vlastiti nivo dokaza.
474
-
475
- Generišite PR workflow, zadano savjetodavan:
476
-
477
- ```bash
478
- mjolnir ci install
479
- ```
480
-
481
- Ili dodajte Marketplace action u workflow koji već imate:
482
-
483
- ```yaml
484
- - uses: Sergey-Bar/Mjolnir@v3
485
- with:
486
- scope: changed
487
- fail-on: error
488
- ```
489
-
490
- Prikujte `@v3` da pratite glavnu liniju, ili tačan tag (`@v0.5.32`) za ponovljivu kapiju. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) pokriva Marketplace, Smithery i MCP registre.
491
-
492
- Da nalaze stavite u GitHub Code Scanning, otpremite SARIF (potrebno `security-events: write` na nivou workflowa ili joba):
493
-
494
- ```yaml
495
- - run: npx mjolnir-qa@3.0.0 --format sarif > mjolnir.sarif
496
- continue-on-error: true
497
- - uses: github/codeql-action/upload-sarif@v3
498
- if: ${{ !cancelled() }}
499
- with:
500
- sarif_file: mjolnir.sarif
501
- ```
502
-
503
- Na GitLabu, `--format codequality` zapisuje Code Quality izvještaj koji čitaju MR widget i diff anotacije ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Podešavanje editora i pipelinea: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
504
-
505
- ### Pripisivanje u opsegu promjena
506
-
507
- ```bash
508
- npx mjolnir-qa@3.0.0 --scope changed
509
- ```
510
-
511
- Nalazi se pripisuju redovima koje je vaša grana dodala, mjereno u odnosu na **merge-base**. Opseg je isti skup datoteka koji otkriva puno skeniranje (TS/JS specifikacije i konfiguracije adaptera, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`), plus necommitovane i nepraćene promjene, pa radi i prije commita. Baza se razrješava redom `main → master → origin/main → origin/master → origin/HEAD`; zamijenite je s `--base <ref>`.
512
-
513
- Kada se merge-base ne može razriješiti (plitki klon, odvojeni HEAD, cilj izvan gita), nalazi se vraćaju na pripisivanje cijeloj datoteci **i izvještaj to kaže.** Tihi prelazak na rezervnu opciju bio bi upravo ona vrsta defekta zbog koje ovaj alat postoji.
514
-
515
- <br />
516
-
517
- ## AI agenti
518
-
519
- Nalazi vrijede samo ako nešto na osnovu njih djeluje.
520
-
521
- ```text
522
- SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
523
- ```
524
-
525
- **AI piše ispravku. Mjölnir je verifikuje.** Dokaz dolazi iz ponovnog skeniranja, nikad iz agentovog vlastitog izvještaja o uspjehu.
526
-
527
- | Naredba | Šta agent dobija |
528
- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
529
- | `mjolnir mcp` | [MCP](https://modelcontextprotocol.io) server preko stdio. `scan`, `explain` i `diff` postaju alati koji se mogu pozvati. |
530
- | `mjolnir handoff` | Sačuvani `--json` izvještaj postaje deterministički Markdown plan: šta je otkriveno, granica dokaza za svaki nalaz, šta se **ne** smije promijeniti i kako verifikovati. |
531
- | `mjolnir install` | Upisuje u agentske površine koje vaš repozitorij već ima (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) kako bi agent ponovo skenirao prije nego što tvrdi da je gotov. |
532
-
533
- Dodajte ga klijentu koji ima vlastiti CLI:
534
-
535
- ```bash
536
- claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
537
- ```
538
-
539
- Ili bilo kojem klijentu koji prima `mcpServers` blok:
540
-
541
- ```json
542
- {
543
- "mcpServers": {
544
- "mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@3.0.0", "mcp"] }
545
- }
546
- }
547
- ```
548
-
549
- **Zaštitna ograda je važnija od udobnosti.** Svaki nalaz u predaji nosi svoju granicu. **E2** kaže _deterministički: provjerite lokaciju i primijenite ispravku_. **E1** kaže _POTREBNA POTVRDA: samo zapažanje ne dokazuje defekt_. Agent koji naslijepo ispravlja E1, utišava pravilo ili mijenja pravilo da podigne ocjenu radi upravo ono zbog čega ovaj alat postoji, pa predaja to kaže u promptu, odmah pored nalaza.
550
-
551
- <br />
552
-
553
- ## Povjerenje i sigurnost
554
-
555
- **Prvo lokalno, nula telemetrije.** Nijedan API sposoban za mrežu (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket) ne postoji nigdje u `src/`, a [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) obara build ako se neki pojavi. Zabranjuje i `eval` i `new Function`. Skeniranje nepouzdanog koda ga nikad ne izvršava: statička analiza čita izvorni tekst, a analiza pokretanja parsira datoteke izvještaja koje već postoje na disku.
556
-
557
- Dvije napomene: sam `npx` preuzima paket prije nego što se išta pokrene, a garancija pokriva `src/`, ne dodatke trećih strana.
558
-
559
- **Dodaci nisu u sandboxu.** JS dodaci (`mjolnir-rules/*.mjs` ili npm paketi navedeni pod `"plugins"`) rade s punim Node privilegijama, istim modelom povjerenja kao ESLint ili Vitest dodaci. Njihovo učitavanje je izričit izbor **po skeniranju**: bez `--enable-plugins` (ili `MJOLNIR_ENABLE_PLUGINS=1`) njihovi izvori se nikad ne učitavaju, a obavještenje na stderr navodi šta je preskočeno. JSON manifesti pravila ne izvršavaju kod, a prefiksi ID-jeva core pravila su rezervisani kako se nijedan dodatak ne bi mogao lažno predstaviti kao neko od njih. Ranjivosti prijavite preko [SECURITY.md](SECURITY.md).
560
-
561
- **Radi na samom sebi.** Motor povjerenja u verifikaciju nema kredibilitet ako sam nije provjerljiv. Svako CI pokretanje skenira ovaj repozitorij buildom koji je proizvelo to isto pokretanje. Kapija pada na svakom nalazu ozbiljnosti error, kao i na **djelimičnom** skeniranju ili **pravilu koje se srušilo**, jer skraćeno samoskeniranje koje ništa ne prijavljuje jeste upravo lažna zelena boja zbog koje ovaj projekat postoji. `mjolnir doctor` u istom pokretanju ponovo revidira bazu pravila (zaštitni zid fixturea, poštenje nivoa, gornja granica nivoa core), a provjera s rezultatom INCONCLUSIVE pada potpuno isto kao neuspjela. Oba izvještaja se otpremaju kao artefakti builda.
562
-
563
- ### Izlazni kodovi i mašinski ugovor
564
-
565
- Zamrznuti, kako biste na njima mogli graditi CI logiku:
566
-
567
- | Izlazni kod | Značenje |
568
- | ----------- | ---------------------------------------------------------------------------------------- |
569
- | `0` | Čisto: nema nalaza na nivou kapije ili iznad |
570
- | `1` | Nalazi na nivou kapije ili iznad |
571
- | `2` | Djelimično skeniranje (istekao vremenski budžet, nečitljive datoteke). Nikad ne blokira. |
572
- | `10` | Greška u upotrebi (pogrešna zastavica, nedostaje cilj) |
573
- | `20` | Interna greška |
574
-
575
- `2` se namjerno razlikuje od `0`: skeniranje koje nije završilo nije "ništa pronašlo". Samo nije završilo s traženjem.
576
-
577
- Sve što mašina troši (rezultati MCP alata, `--json`, SARIF 2.1) dolazi iz jednog kanonskog rezultata pod verzionisanom shemom koja se **samo proširuje** (`schemaVersion: 1`, `contractVersion: 1`), tako da nijedan potrošač ne mora rekonstruisati značenje iz renderovanog teksta. Pogledajte [mašinski ugovor](docs/machine-contract.md). ID-jevi pravila (`QA-<FAMILY>-NNN`) su nepromjenjivi nakon isporuke i nikad se ne koriste ponovo.
578
-
579
- <br />
580
-
581
- ## Šta vam Mjölnir ne može reći
582
-
583
- - **Ne pokreće vaše testove.** Čisto skeniranje nije skup testova koji prolazi.
584
- - **Ne može vam reći da je asercija _pogrešna_.** `expect(total).toBe(41)` izgleda zdravo. Mjölnir pronalazi testove koji _ne mogu pasti_ i pipelineove koji _ne mogu postati crveni_, a ne testove koji provjeravaju pogrešnu stvar.
585
- - **Ne dokazuje poslovnu ispravnost.** Ništa ovdje ne kaže da vaš proizvod radi ono što je zahtjev tražio.
586
- - **100 nije dokaz dobrog skupa testova.** Da li vaš skup pokriva vaš stvarni rizik je drugo pitanje, a ovaj alat na njega ne odgovara.
587
- - **5 od 79 pravila se isporučuje na procjeni**, a ne na izmjerenoj stopi. Svako od njih to kaže na vlastitom nalazu.
588
- - **E1 nije E2.** Heuristički nalazi vrijede čitanja, ali ne i primjene naslijepo.
589
- - **Prazan repozitorij dobija `null`, nikad 100.**
590
- - **Datoteka nazvana `*.spec.ts` bez deklaracija testova ne računa se kao pokrivenost.** Repozitorij čije jedine spec datoteke sadrže importe ili tipove (nula poziva `it`/`test`) dobija `null`, a ne 100.
591
-
592
- <br />
593
-
594
- ## Dokumentacija
595
-
596
- Kompletna stranica dokumentacije nalazi se na <https://sergey-bar.github.io/Mjolnir/>.
597
-
598
- | Dokument | Šta sadrži |
599
- | ------------------------------------------------------ | ------------------------------------------------------ |
600
- | [docs/SCORING.md](docs/SCORING.md) | Normalizacija ocjene i ponderisanje dokaza |
601
- | [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Kanonski rječnik: jedna riječ po pojmu |
602
- | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Izmjerene stope lažno pozitivnih rezultata i metoda |
603
- | [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Stanja pravila, nivoi, utišavanje, povlačenje |
604
- | [docs/VERSIONING.md](docs/VERSIONING.md) | Semver politika, zamrznute površine, ciklus povlačenja |
605
- | [docs/machine-contract.md](docs/machine-contract.md) | Kanonski mašinski čitljiv rezultat |
606
- | [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF izlaz i podešavanje editora ili CI-ja |
607
- | [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: Code Quality izvještaj, MR recept, kapija |
608
- | [docs/rules/](docs/rules/) | Generisani katalog po pravilu |
609
- | [CONTRIBUTING.md](CONTRIBUTING.md) | Razvojno okruženje i tok doprinosa |
610
- | [SUPPORT.md](SUPPORT.md) | Gdje pitati, prijaviti i dobiti pomoć |
611
- | [SECURITY.md](SECURITY.md) | Prijava ranjivosti |
612
- | [CHANGELOG.md](CHANGELOG.md) | Historija izdanja |
613
-
614
- ### Status
615
-
616
- **Verzija 1.** JSON shema i izlazni kodovi su zamrznuti ugovori. TypeScript i Python imaju najširu izmjerenu pokrivenost. Java i C# su noviji; čitajte ih kroz [tabelu zrelosti](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle). Šta slijedi, bez izmišljenih datuma: [javna mapa puta](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
617
-
618
- ### Doprinos
619
-
620
- Nova pravila su najlakši prvi doprinos. Jedna naredba pravi kostur pravila s njegovim must-fire **i** must-not-fire fixtureima. Generisano pravilo namjerno pada na vlastitim fixtureima dok se ne napiše stvarna detekcija, jer isporučeni kostur jeste pravilo koje niko nije izmjerio:
621
-
622
- ```bash
623
- mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
624
- ```
625
-
626
- Razvojno okruženje, naredbe stalnih kapija te zakoni anti-creep i zaštitnog zida fixturea nalaze se u [CONTRIBUTING.md](CONTRIBUTING.md).
627
-
628
- <br />
629
-
630
- <div align="center">
631
-
632
- <img src="assets/readme/closing.svg" alt="Pokrenite ga na svom repozitoriju." width="100%" />
633
-
634
- ```bash
635
- npx mjolnir-qa@3.0.0
636
- ```
637
-
638
- [Pročitajte vodič](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Stranica dokumentacije](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
639
-
640
- <br />
641
-
642
- Ne pitajte jesu li testovi prošli.<br />
643
- Pitajte dokazuju li dokazi da zaslužuju povjerenje.
644
-
645
- <sub>Napravio [Sergey Bar](https://www.linkedin.com/in/sergeybar/) · MIT licenca</sub>
646
-
647
- </div>