mjolnir-qa 4.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/CHANGELOG.md +3178 -16
- package/README.md +81 -760
- package/dist/cli.d.mts +552 -206
- package/dist/cli.mjs +31409 -13990
- package/dist/mcp/stdio.mjs +1290 -405
- package/package.json +76 -32
- package/README.ar.md +0 -647
- package/README.bn.md +0 -647
- package/README.br.md +0 -647
- package/README.bs.md +0 -647
- package/README.da.md +0 -647
- package/README.de.md +0 -647
- package/README.es.md +0 -647
- package/README.fr.md +0 -647
- package/README.gr.md +0 -647
- package/README.he.md +0 -647
- package/README.it.md +0 -647
- package/README.ja.md +0 -647
- package/README.ko.md +0 -647
- package/README.no.md +0 -647
- package/README.pl.md +0 -647
- package/README.ru.md +0 -647
- package/README.th.md +0 -647
- package/README.tr.md +0 -647
- package/README.uk.md +0 -647
- package/README.vi.md +0 -647
- package/README.zh.md +0 -647
- package/README.zht.md +0 -647
- package/dist/scan-pipeline-Bg-46cLS.mjs +0 -2
- package/dist/scan-pipeline-CCJdEKNa.mjs +0 -16336
package/README.gr.md
DELETED
|
@@ -1,647 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
<img src="assets/readme/hero.svg" alt="Mjölnir. Τα τεστ σού λένε τι πέρασε. Το Mjölnir σού λέει τι μπορείς να εμπιστευτείς." width="100%" />
|
|
4
|
-
|
|
5
|
-
<br />
|
|
6
|
-
|
|
7
|
-
Το Mjölnir βρίσκει τεστ που δεν μπορούν να αποτύχουν και pipelines που δεν μπορούν να γίνουν κόκκινα,<br />
|
|
8
|
-
και στη συνέχεια βαθμολογεί πόσο μπορεί να εμπιστευτεί κανείς το αποτέλεσμα, με το τεκμήριο για κάθε πόντο.
|
|
9
|
-
|
|
10
|
-
<br />
|
|
11
|
-
|
|
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
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npx mjolnir-qa@3.0.0
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
[Δείτε το σε δράση](#δείτε-το-σε-δράση) · [Γρήγορη εκκίνηση](#γρήγορη-εκκίνηση) · [Τι βρίσκει](#τι-βρίσκει-το-mjölnir) · [Βαθμολογία](#η-βαθμολογία-αξιοπιστίας) · [Τεκμήρια](#το-μοντέλο-τεκμηρίωσης) · [Ανάλυση εκτελέσεων](#ανάλυση-εκτελέσεων-τεστ) · [CI](#ακεραιότητα-ci) · [Πράκτορες](#πράκτορες-τν) · [Ασφάλεια](#εμπιστοσύνη-και-ασφάλεια) · [Όρια](#τι-δεν-μπορεί-να-σας-πει-το-mjölnir) · [Τεκμηρίωση](#τεκμηρίωση)
|
|
25
|
-
|
|
26
|
-
<details>
|
|
27
|
-
<summary>Διαβάστε σε άλλη γλώσσα — 22 μεταφράσεις</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) | Ελληνικά | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
|
|
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
|
-
## Ένα πράσινο τικ είναι ισχυρισμός, όχι απόδειξη
|
|
56
|
-
|
|
57
|
-
Ένα πράσινο τικ σημαίνει ότι το pipeline δεν απέτυχε. Δεν σημαίνει ότι τα τεστ εκτελέστηκαν ή ότι θα μπορούσαν να αποτύχουν. Κάθε ένα από αυτά περνά πράσινο:
|
|
58
|
-
|
|
59
|
-
- ένα `.only` σε commit που εκτέλεσε 3 τεστ αντί για 900
|
|
60
|
-
- `continue-on-error: true` στο job που έπρεπε να μπλοκάρει
|
|
61
|
-
- `|| true` μετά την εντολή των τεστ
|
|
62
|
-
- ένα τεστ που δεν ελέγχει τίποτα ή έχει άδειο σώμα
|
|
63
|
-
- ένα wrapper επαναλήψεων που μετατρέπει μια πραγματική αποτυχία σε τυχερή επιτυχία
|
|
64
|
-
- μια αναφορά που το workflow ανεβάζει αλλά δεν δημιούργησε ποτέ
|
|
65
|
-
- ένα σταθερό sleep που κρατά όρθια μια συνθήκη ανταγωνισμού
|
|
66
|
-
|
|
67
|
-
Κανένα δεν κάνει το pipeline κόκκινο, και το καθένα φαίνεται σκόπιμο στο review. Γι' αυτό επιβιώνουν. Ιδού το Mjölnir να διαβάζει ένα πραγματικό:
|
|
68
|
-
|
|
69
|
-
<p align="center">
|
|
70
|
-
<img src="assets/readme/scan.svg" alt="Το CI workflow του αποθετηρίου επίδειξης, διαβασμένο γραμμή προς γραμμή. Το Mjölnir σημειώνει κάθε εύρημα στη γραμμή που ανέφερε, με τον κανόνα του, τι είναι λάθος, το επίπεδο τεκμηρίωσης και το μετρημένο ποσοστό ψευδώς θετικών." width="800" />
|
|
71
|
-
</p>
|
|
72
|
-
|
|
73
|
-
<sub>Κάθε εύρημα που ανέφερε η σάρωση επίδειξης για αυτό το workflow, στη γραμμή που ανέφερε. Δημιουργείται με `npm run docs:readme-brand` από το [`demo-report.json`](assets/readme/demo-report.json) και κλειδώνεται έναντι αποκλίσεων στο CI.</sub>
|
|
74
|
-
|
|
75
|
-
**Αυστηρή λειτουργία.** Οι πιο επιθετικές ανιχνεύσεις — `.only`, `continue-on-error`, κενά τεστ, κατάχρηση επανάληψης — ζουν στο επίπεδο καραντίνας. Τρέχουν μόνο με `--strict` και περιορίζονται σε σοβαρότητα `info`: ειδοποιούν, δεν μπλοκάρουν ποτέ. Η προεπιλεγμένη σάρωση (`npx mjolnir-qa@3.0.0` χωρίς `--strict`) καλύπτει μόνο βασικούς και εκτεταμένους κανόνες. Προσθέστε `--strict` όταν θέλετε και το επίπεδο συμβουλών.
|
|
76
|
-
|
|
77
|
-
Το Mjölnir διαβάζει τη σουίτα, τα CI workflows και, αν υπάρχει, την αναφορά μιας πραγματικής εκτέλεσης. Δεν εκτελεί τα τεστ σας, δεν εγκαθιστά τις εξαρτήσεις σας και δεν εκτελεί τον κώδικα που σαρώνει. Κι όταν δεν έχει τεκμήρια, το λέει αντί να επινοεί βεβαιότητα:
|
|
78
|
-
|
|
79
|
-
| Κατάσταση | Τι αναφέρει το Mjölnir |
|
|
80
|
-
| ------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
81
|
-
| Δεν βρέθηκαν δηλώσεις τεστ | Βαθμολογία `null`, εμφανίζεται ως **UNKNOWN**. Ποτέ ένα επινοημένο 100. |
|
|
82
|
-
| Χωρίς baseline ή συγκρίσιμη αναθεώρηση | **UNKNOWN**, με ρητή αιτία. Ποτέ ένα υποτιθέμενο 0. |
|
|
83
|
-
| Η σάρωση διακόπηκε (χρονικό όριο, μη αναγνώσιμα αρχεία) | **PARTIAL**, έξοδος `2`. Ποτέ δεν παρουσιάζεται ως καθαρή. |
|
|
84
|
-
|
|
85
|
-
<p align="center">
|
|
86
|
-
<img src="assets/readme/how-it-works.svg" alt="Πώς λειτουργεί το Mjölnir. Διαβάζει στατικά τη σουίτα τεστ και το CI pipeline, καθώς και την αναφορά μιας πραγματικής εκτέλεσης όταν υπάρχει. Σταθμίζει κάθε εύρημα με βάση το επίπεδο τεκμηρίωσης και το επίπεδο εμπιστοσύνης του, όπου μόνο μια πραγματική εκτέλεση φτάνει τα L3 έως L5, και παράγει ευρήματα, μια βαθμολογία αξιοπιστίας και μια πύλη CI με παγωμένους κωδικούς εξόδου. Στον βρόχο του πράκτορα, η τεχνητή νοημοσύνη γράφει τη διόρθωση και το Mjölnir σαρώνει ξανά για να την αποδείξει." width="880" />
|
|
87
|
-
</p>
|
|
88
|
-
|
|
89
|
-
<sub>Σχεδιασμένο για αυτή τη σελίδα και εμφανίζεται σε κλίμακα 1:1. Δημιουργείται με `npm run docs:readme-brand` και κλειδώνεται έναντι αποκλίσεων στο CI· η βαθμολογία, οι μετρήσεις και το ID του κανόνα προέρχονται από τα [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) και το μητρώο κανόνων, ποτέ δεν πληκτρολογούνται με το χέρι. Η ίδια εικόνα ως αφίσα: [`architecture.svg`](assets/readme/architecture.svg).</sub>
|
|
90
|
-
|
|
91
|
-
<br />
|
|
92
|
-
|
|
93
|
-
## Δείτε το σε δράση
|
|
94
|
-
|
|
95
|
-
Μια πραγματική σάρωση του [`examples/demo-repo`](examples/demo-repo), μιας μικρής σουίτας Playwright με CI workflow. Εδώ πήγαν οι πόντοι της:
|
|
96
|
-
|
|
97
|
-
<p align="center">
|
|
98
|
-
<img src="assets/readme/terminal-hero.svg" alt="Η ανάλυση αφαιρέσεων του Mjölnir: WORTHINESS 80/100 WORTHY, η βαθμολογία ανά κατηγορία, το πλαίσιο αφαιρέσεων ανά σοβαρότητα και μια λίστα FIX THIS FIRST" width="520" />
|
|
99
|
-
</p>
|
|
100
|
-
|
|
101
|
-
<sub>Δημιουργείται με `npm run docs:hero` από πραγματική σάρωση και κλειδώνεται έναντι αποκλίσεων στο CI. Η πλήρης αναφορά `--verbose` της ίδιας σάρωσης είναι το [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
|
|
102
|
-
|
|
103
|
-
<details>
|
|
104
|
-
<summary><strong>Δείτε το</strong> — μια σάρωση, η διόρθωση που τυπώνει και η νέα σάρωση που την αποδεικνύει</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="Ένα καρέ της εγγραφής επίδειξης: το npx mjolnir-qa@3.0.0 σαρώνει το αποθετήριο επίδειξης σε ένα παράθυρο τερματικού" width="900" />
|
|
111
|
-
</a>
|
|
112
|
-
</p>
|
|
113
|
-
|
|
114
|
-
<sub>Αποδόθηκε καρέ προς καρέ από πραγματική σάρωση με `npm run docs:video`· ποτέ δεν καταγράφηκε από την οθόνη. Επιλέξτε το καρέ για να ανοίξετε το [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4).</sub>
|
|
115
|
-
|
|
116
|
-
</details>
|
|
117
|
-
|
|
118
|
-
### Ένα εύρημα από κοντά
|
|
119
|
-
|
|
120
|
-
Κάθε εύρημα απαντά σε τέσσερα ερωτήματα: πού βρίσκεται, πόσο σίγουρο είναι το Mjölnir, πόσο συχνά κάνει λάθος ο κανόνας και πώς διορθώνεται.
|
|
121
|
-
|
|
122
|
-
<p align="center">
|
|
123
|
-
<img src="assets/readme/finding-anatomy.svg" alt="Το πρώτο εύρημα της σάρωσης επίδειξης, ακριβώς όπως το τυπώνει το τερματικό, με τα τέσσερα μέρη του σημειωμένα: πού, πόσο σίγουρο, πόσο συχνά κάνει λάθος ο κανόνας, και η διόρθωση." width="100%" />
|
|
124
|
-
</p>
|
|
125
|
-
|
|
126
|
-
Το `mjolnir explain QA-CI-001` τυπώνει ολόκληρο το ιστορικό εμπιστοσύνης ενός κανόνα, μαζί με το μετρημένο ποσοστό ψευδώς θετικών και το επίπεδο που του εξασφάλισε αυτό το ποσοστό:
|
|
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
|
-
Αυτή είναι η μονάδα αξίας: ένα σημείο όπου το CI αναφέρει μια επιτυχία που δεν κέρδισε.
|
|
173
|
-
|
|
174
|
-
<br />
|
|
175
|
-
|
|
176
|
-
## Γρήγορη εκκίνηση
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
npx mjolnir-qa@3.0.0
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
Σαρώνει τον τρέχοντα κατάλογο και τυπώνει το Trust Report: τι βρήκε, πόσο μπορείτε να το εμπιστευτείτε, γιατί και τι να κάνετε μετά. Τερματίζει με `0` όταν δεν βρέθηκε τίποτα στο επίπεδο της πύλης ή πάνω από αυτό.
|
|
183
|
-
|
|
184
|
-
Στο CI, σαρώστε μόνο ό,τι εισήγαγε το branch, ώστε μια παλιά σουίτα να μη πνίξει το πρώτο σας pull request:
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
npx mjolnir-qa@3.0.0 --scope changed
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Το `mjolnir ci install` το γράφει ως GitHub Actions workflow, χρησιμοποιώντας το [action](https://github.com/Sergey-Bar/Mjolnir#readme) καρφιτσωμένο στο κύριο tag `v3` (ή απλό `npx` με `--no-action`). Παραμένει συμβουλευτικό μέχρι να αποφασίσετε ότι πρέπει να μπλοκάρει.
|
|
191
|
-
|
|
192
|
-
| Εντολή | Τι κάνει |
|
|
193
|
-
| --------------------------------------------- | ------------------------------------------------------------------- |
|
|
194
|
-
| `mjolnir` | Trust Report: ετυμηγορία, βεβαιότητα, επόμενη ενέργεια |
|
|
195
|
-
| `mjolnir --scope changed` | Μόνο ό,τι εισήγαγε το branch σας (η μορφή για CI) |
|
|
196
|
-
| `mjolnir ci install` | Δημιουργεί το συμβουλευτικό workflow για PR (βασισμένο στο action) |
|
|
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` | Τι, γιατί και διόρθωση, συν το μετρημένο ποσοστό FP |
|
|
213
|
-
| `mjolnir why src/a.spec.ts:42` | Γιατί σημειώθηκε ακριβώς αυτή η γραμμή. Δεν μπλοκάρει ποτέ. |
|
|
214
|
-
| `mjolnir forensics ./test-results/` | Τεκμήρια χρόνου εκτέλεσης από πραγματική εκτέλεση |
|
|
215
|
-
| `mjolnir trust-report` | Αυτόνομο Trust Artifact (md + json) |
|
|
216
|
-
| `mjolnir handoff` | Σχέδιο αποκατάστασης για πράκτορα κώδικα |
|
|
217
|
-
| `mjolnir --json` / `--format sarif` | Έξοδος αναγνώσιμη από μηχανές, GitHub Code Scanning |
|
|
218
|
-
| `mjolnir --format codequality` | Αναφορά GitLab Code Quality (artifact του widget του MR) |
|
|
219
|
-
| `mjolnir --strict` | Εκτελεί επίσης κανόνες επιπέδου quarantine (υψηλότερος κίνδυνος FP) |
|
|
220
|
-
|
|
221
|
-
<details>
|
|
222
|
-
<summary><strong>Όλες οι υπόλοιπες εντολές</strong> — διαλογή ασταθών τεστ, αναφορές, διακυβέρνηση</summary>
|
|
223
|
-
|
|
224
|
-
<br />
|
|
225
|
-
|
|
226
|
-
| Εντολή | Τι κάνει |
|
|
227
|
-
| ----------------------------------- | ------------------------------------------------------------------------------------- |
|
|
228
|
-
| `mjolnir --classic` | Το banner βαθμολογίας πριν από το Trust Report |
|
|
229
|
-
| `mjolnir explain verdict` | Γιατί η ετυμηγορία της αποθηκευμένης σάρωσης είναι αυτή που είναι |
|
|
230
|
-
| `mjolnir triage ./test-results/` | Καθοδηγούμενη διαλογή. Κάθε γραμμή τελειώνει με μια επόμενη ενέργεια. |
|
|
231
|
-
| `mjolnir pw-report ./test-results/` | Σύνοψη εκτέλεσης Playwright: επαναλήψεις, ασταθή τεστ, τα πιο αργά |
|
|
232
|
-
| `mjolnir doctor:playwright` | Βαθιά σάρωση μόνο για Playwright συν Selector Health Score |
|
|
233
|
-
| `mjolnir fix --dry-run` / `fix` | Ασφαλείς αυτόματες διορθώσεις, καθεμία ξανασαρωμένη για να αποδειχθεί ότι εφαρμόστηκε |
|
|
234
|
-
| `mjolnir baseline` / `diff` | Στιγμιότυπο των ευρημάτων, και μετά αναφορά μόνο των νέων ή χειρότερων |
|
|
235
|
-
| `mjolnir impact --since <ref>` | Τι εισήγαγε και τι επέλυσε ένα commit |
|
|
236
|
-
| `mjolnir summary` | Σημειώσεις CI και σύνοψη step από μια αναφορά |
|
|
237
|
-
| `mjolnir pr-comment` | Ένα στοχευμένο σχόλιο PR, σε Markdown |
|
|
238
|
-
| `mjolnir debt` | Μητρώο τεχνικού χρέους τεστ με μοντέλο κόστους |
|
|
239
|
-
| `mjolnir handover` | Χάρτης γνωριμίας με τη σουίτα για νέο μηχανικό QA |
|
|
240
|
-
| `mjolnir init` | Ανιχνεύει frameworks, τυπώνει λίστα ελέγχου ρύθμισης |
|
|
241
|
-
| `mjolnir suppressions` | Εμφανίζει τα κατασταλμένα ευρήματα, για διακυβέρνηση |
|
|
242
|
-
| `mjolnir rules --unmeasured` | Οι κανόνες που λειτουργούν με υπόθεση, όχι με μέτρηση |
|
|
243
|
-
| `mjolnir rules --md` | Πλήρης κατάλογος κανόνων (JSON ή Markdown) |
|
|
244
|
-
| `mjolnir doctor` | Αυτοέλεγχος της βάσης κανόνων του ίδιου του Mjölnir |
|
|
245
|
-
| `mjolnir create-rule <ID>` | Δημιουργεί σκελετό για νέο κανόνα και τα fixtures του |
|
|
246
|
-
| `mjolnir stats` | Τοπικοί μετρητές όλων των διορθώσεων που έχουν εμφανιστεί |
|
|
247
|
-
| `mjolnir badge` | JSON endpoint του shields.io και απόσπασμα κώδικα |
|
|
248
|
-
| `mjolnir --cache` | Επαυξητικές νέες σαρώσεις μέσω τοπικής cache ετυμηγοριών |
|
|
249
|
-
| `mjolnir --format mermaid` | Διάγραμμα αρχιτεκτονικής τεστ για σχόλιο PR |
|
|
250
|
-
|
|
251
|
-
Το `mjolnir help <command>` τυπώνει τη χρήση, παραδείγματα και το επόμενο βήμα για οποιαδήποτε από αυτές.
|
|
252
|
-
|
|
253
|
-
</details>
|
|
254
|
-
|
|
255
|
-
Απαιτεί **Node.js ≥ 22.18** σε Windows, macOS ή Linux. Προτιμάτε καθολική εγκατάσταση; `npm i -g mjolnir-qa`. Το ελάχιστο όριο προέρχεται από την αλυσίδα εργαλείων build (το tsdown το στοχεύει και το pipeline κυκλοφορίας κάνει smoke tests σε αυτό)· οι εξαρτήσεις χρόνου εκτέλεσης δεν χρειάζονται τίποτα περισσότερο.
|
|
256
|
-
|
|
257
|
-
<br />
|
|
258
|
-
|
|
259
|
-
## Τι βρίσκει το Mjölnir
|
|
260
|
-
|
|
261
|
-
<p align="center">
|
|
262
|
-
<img src="assets/readme/stack.svg" alt="Λειτουργεί με τη στοίβα σας: οι γλώσσες, τα frameworks τεστ και τα συστήματα CI που καλύπτουν οι κανόνες του, από το μητρώο κανόνων." width="100%" />
|
|
263
|
-
</p>
|
|
264
|
-
|
|
265
|
-
**79 κανόνες** σε τέσσερις οικογένειες — υγιεινή τεστ, ποιότητα τεστ, Playwright και ακεραιότητα CI — για TypeScript και JavaScript, Python, Java, C# και YAML του GitHub Actions. Καλύπτουν το Playwright και στα τέσσερα bindings, καθώς και pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest και Mocha, με αρχική κάλυψη για Cypress και Selenium. Εννέα από αυτούς, για να φανεί η μορφή:
|
|
266
|
-
|
|
267
|
-
| ID | Κανόνας | Σοβαρότητα | Επίπεδο |
|
|
268
|
-
| ------------ | ----------------------------------------------------------------------------- | ---------- | ---------- |
|
|
269
|
-
| QA-CI-001 | Το `continue-on-error` κρύβει μια αποτυχημένη πύλη επαλήθευσης | error | quarantine |
|
|
270
|
-
| QA-CI-009 | Ο κωδικός εξόδου των τεστ δεν μεταφέρεται (`\|` χωρίς pipefail, αλυσίδες `;`) | error | extended |
|
|
271
|
-
| QA-TEST-001 | Εστιασμένο τεστ σε commit (`.only`, `fit`) | error | quarantine |
|
|
272
|
-
| QA-TEST-003 | Τεστ χωρίς ισχυρισμούς | error | quarantine |
|
|
273
|
-
| QA-TQUAL-009 | Ισχυρισμός σε promise χωρίς await | error | quarantine |
|
|
274
|
-
| QA-PW-002 | Ισχυρισμός σε locator χωρίς await | error | core |
|
|
275
|
-
| QA-PW-004 | Εύθραυστοι επιλογείς CSS/XPath | warning | quarantine |
|
|
276
|
-
| QA-PY-002 | Παραλειπόμενο τεστ (`skip`, μη αυστηρό `xfail`) | warning | core |
|
|
277
|
-
| QA-CS-103 | Μέθοδος τεστ χωρίς ισχυρισμούς | error | core |
|
|
278
|
-
|
|
279
|
-
Ο πλήρης κατάλογος δημιουργείται από το μητρώο, ποτέ δεν συντηρείται με το χέρι: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) ή ο [οδηγός για το τι ελέγχει](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
|
|
280
|
-
|
|
281
|
-
<details>
|
|
282
|
-
<summary><strong>Κάθε κανόνας που αναφέρεται σε αυτό το README</strong>, σε έναν πίνακα</summary>
|
|
283
|
-
|
|
284
|
-
<br />
|
|
285
|
-
|
|
286
|
-
> Οι κανόνες `quarantine` εκτελούνται μόνο με `--strict` και δεν μπλοκάρουν ποτέ (περιορίζονται σε info). Η σοβαρότητα που εμφανίζεται είναι αυτή που όρισε ο δημιουργός.
|
|
287
|
-
|
|
288
|
-
| ID | Οικογένεια | Κανόνας | Σοβαρότητα | Επίπεδο |
|
|
289
|
-
| ------------ | ---------- | ----------------------------------------------------------------------- | ---------- | ---------- |
|
|
290
|
-
| QA-TEST-001 | Υγιεινή | Εστιασμένο τεστ σε commit (`.only`, `fit`) | error | quarantine |
|
|
291
|
-
| QA-TEST-002 | Υγιεινή | Παραλειπόμενο τεστ. Κλιμακώνεται σε `error` χωρίς καταγεγραμμένη αιτία. | warning | quarantine |
|
|
292
|
-
| QA-TEST-003 | Υγιεινή | Τεστ χωρίς ισχυρισμούς | error | quarantine |
|
|
293
|
-
| QA-TEST-004 | Υγιεινή | Σταθερό sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
|
|
294
|
-
| QA-TEST-006 | Υγιεινή | Κατάχρηση επαναλήψεων που κρύβει την αστάθεια | warning | quarantine |
|
|
295
|
-
| QA-TEST-010 | Υγιεινή | Άδειο σώμα τεστ | error | quarantine |
|
|
296
|
-
| QA-TQUAL-002 | Ποιότητα | Ταυτολογικός ισχυρισμός | error | quarantine |
|
|
297
|
-
| QA-TQUAL-009 | Ποιότητα | Ισχυρισμός σε promise χωρίς await | error | quarantine |
|
|
298
|
-
| QA-TQUAL-011 | Ποιότητα | Τεστ σε σχόλια | warning | extended |
|
|
299
|
-
| QA-PW-002 | Playwright | Ισχυρισμός σε locator χωρίς await | error | core |
|
|
300
|
-
| QA-PW-003 | Playwright | `page.pause()` / `test.only()` σε commit | error | core |
|
|
301
|
-
| QA-PW-004 | Playwright | Εύθραυστοι επιλογείς CSS/XPath | warning | quarantine |
|
|
302
|
-
| QA-PW-123 | Playwright | Σκληροκωδικοποιημένα URL περιβαλλόντων | warning | quarantine |
|
|
303
|
-
| QA-PW-140 | Playwright | Στιγμιότυπο οθόνης χωρίς `maxDiffPixelRatio` | warning | core |
|
|
304
|
-
| QA-CI-001 | CI | Το `continue-on-error` κρύβει μια αποτυχημένη πύλη | error | quarantine |
|
|
305
|
-
| QA-CI-002 | CI | Το `\|\| true` καταπίνει κωδικούς εξόδου | error | extended |
|
|
306
|
-
| QA-CI-005 | CI | Αναφορά που καταναλώνεται αλλά δεν δημιουργείται ποτέ | error | quarantine |
|
|
307
|
-
| QA-CI-007 | CI | Wrappers επαναλήψεων γύρω από τα τεστ | warning | extended |
|
|
308
|
-
| QA-CI-008 | CI | Step που πετυχαίνει πάντα κρύβει αποτυχίες | error | quarantine |
|
|
309
|
-
| QA-CI-009 | CI | Ο κωδικός εξόδου δεν μεταφέρεται (`\|` χωρίς pipefail, αλυσίδες `;`) | error | extended |
|
|
310
|
-
| QA-CI-010 | CI | Τεστ που παραλείπονται εκεί όπου πρέπει να μπλοκάρουν | error | quarantine |
|
|
311
|
-
| QA-PY-002 | Python | Παραλειπόμενο τεστ (`skip`, μη αυστηρό `xfail`) | warning | core |
|
|
312
|
-
| QA-PY-003 | Python | Συνάρτηση τεστ χωρίς ισχυρισμούς | error | quarantine |
|
|
313
|
-
| QA-PY-005 | Python | `time.sleep()` στα τεστ | warning | extended |
|
|
314
|
-
| QA-PY-012 | Python | Ταυτολογικός ισχυρισμός | error | quarantine |
|
|
315
|
-
| QA-JV-101 | Java | Απενεργοποιημένο τεστ (`@Disabled`) | warning | core |
|
|
316
|
-
| QA-JV-102 | Java | Σταθερό sleep (`Thread.sleep()`) | warning | extended |
|
|
317
|
-
| QA-JV-103 | Java | Μέθοδος τεστ χωρίς ισχυρισμούς | error | extended |
|
|
318
|
-
| QA-JV-105 | Java | Σταθερό sleep με `waitForTimeout()` του Playwright | warning | core |
|
|
319
|
-
| QA-JV-106 | Java | Εύθραυστος επιλογέας αντί για locator βάσει ρόλου | warning | quarantine |
|
|
320
|
-
| QA-CS-101 | C# | Παραλειπόμενο τεστ (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
|
|
321
|
-
| QA-CS-102 | C# | Σταθερό sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
|
|
322
|
-
| QA-CS-103 | C# | Μέθοδος τεστ χωρίς ισχυρισμούς | error | core |
|
|
323
|
-
| QA-CS-105 | C# | Σταθερό sleep με `WaitForTimeoutAsync()` | warning | extended |
|
|
324
|
-
| QA-CS-106 | C# | Εύθραυστος επιλογέας αντί για locator βάσει ρόλου | warning | quarantine |
|
|
325
|
-
|
|
326
|
-
Η Python περιλαμβάνει επίσης τους QA-PY-001…012 (υγιεινή pytest) και QA-PY-101…108 (Playwright για Python). Τα Cypress και Selenium έχουν αρχικά σύνολα τριών κανόνων το καθένα.
|
|
327
|
-
|
|
328
|
-
</details>
|
|
329
|
-
|
|
330
|
-
Κάθε κανόνας κυκλοφορεί με ένα fixture must-fire **και** ένα must-not-fire, και ένας κανόνας που ενεργοποιείται στο δικό του αρνητικό fixture δεν μπορεί να κυκλοφορήσει. Αυτό είναι το τείχος προστασίας από ψευδώς θετικά· το `mjolnir doctor` το επιβάλλει στο CI αυτού του αποθετηρίου.
|
|
331
|
-
|
|
332
|
-
### Selector Health Score
|
|
333
|
-
|
|
334
|
-
Το `mjolnir doctor:playwright` βαθμολογεί κάθε locator ανάλογα με το πώς βρίσκει ένα στοιχείο: όπως θα το έκανε ένας χρήστης (ρόλος, ετικέτα, κείμενο), μέσω ρητού συμβολαίου (`data-testid`) ή από δομική σύμπτωση (αλυσίδες CSS, XPath). Κάθε αρχείο παίρνει βαθμολογία από 0 έως 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
|
-
Αυτό μετρά **ανθεκτικότητα, όχι ορθότητα**. Το `.btn.btn-primary > div:nth-child(2)` περνά σήμερα και θα συνεχίσει να περνά μέχρι κάποιος να αγγίξει το markup. Μια χαμηλή βαθμολογία δεν ισχυρίζεται ποτέ ότι το τεστ είναι χαλασμένο, μόνο ότι εξαρτάται από markup που κανείς δεν υποσχέθηκε να διατηρήσει.
|
|
349
|
-
|
|
350
|
-
<br />
|
|
351
|
-
|
|
352
|
-
## Η βαθμολογία αξιοπιστίας
|
|
353
|
-
|
|
354
|
-
<p align="center">
|
|
355
|
-
<img src="assets/readme/score-gauge.svg" alt="Η κλίμακα αξιοπιστίας από 0 έως 100, με έναν δείκτη που διατρέχει κάθε βαθμολογία: UNWORTHY κάτω από 50, NEEDS WORK από 50 έως 79, WORTHY από 80 έως 99, FORGED στο 100" width="720" />
|
|
356
|
-
</p>
|
|
357
|
-
|
|
358
|
-
<sub>Κάθε βαθμολογία από 0 έως 100, τοποθετημένη από το πραγματικό `deriveScoreState`. Δημιουργείται με `npm run docs:gauge` και κλειδώνεται έναντι αποκλίσεων στο CI.</sub>
|
|
359
|
-
|
|
360
|
-
| Βαθμολογία | Ετυμηγορία |
|
|
361
|
-
| ---------- | --------------------------------------- |
|
|
362
|
-
| `0 – 49` | **UNWORTHY** |
|
|
363
|
-
| `50 – 79` | **NEEDS WORK** |
|
|
364
|
-
| `80 – 99` | **WORTHY** |
|
|
365
|
-
| `100` | **FORGED** |
|
|
366
|
-
| `null` | **UNKNOWN**: δεν βρέθηκαν δηλώσεις τεστ |
|
|
367
|
-
|
|
368
|
-
**Πώς υπολογίζεται.** Η σοβαρότητα ορίζει μια βασική αφαίρεση (`error −8`, `warning −3`, `info −1`) και το επίπεδο τεκμηρίωσης τη μειώνει: το E2 μετρά πλήρως, το E1 κατά το ήμισυ (με στρογγυλοποίηση προς τα κάτω), το E0 καθόλου. Το σύνολο κανονικοποιείται με βάση την έκθεση της σουίτας, δηλαδή αφαιρέσεις ανά δήλωση τεστ αντί ανά αρχείο. Το τερματικό τυπώνει τους ίδιους μειωμένους αριθμούς που χρησιμοποίησε η βαθμολογία· δεν υπάρχει κρυφό δεύτερο μοντέλο. Λεπτομέρειες: [docs/SCORING.md](docs/SCORING.md) και ο [οδηγός βαθμολόγησης](https://sergey-bar.github.io/Mjolnir/guide/scoring).
|
|
369
|
-
|
|
370
|
-
**Τι δεν σημαίνει το 100.** Δεν σημαίνει ότι το λογισμικό είναι σωστό, ότι η σουίτα επαρκεί ή ότι το προϊόν είναι απαλλαγμένο από ελαττώματα. Σημαίνει ένα πράγμα: **κανένας από τους κανόνες που αξιολόγησε το Mjölnir δεν παρήγαγε αφαίρεση σε αυτή τη σάρωση και με αυτό το μοντέλο τεκμηρίωσης.**
|
|
371
|
-
|
|
372
|
-
<br />
|
|
373
|
-
|
|
374
|
-
## Το μοντέλο τεκμηρίωσης
|
|
375
|
-
|
|
376
|
-
Κάθε εύρημα φέρει δύο ετικέτες: πόσο σίγουρο είναι το Mjölnir και πόσο έχει ελεγχθεί το εύρημα. Αυτή είναι η διαφορά ανάμεσα σε ένα εργαλείο που αναφέρει μοτίβα και σε ένα εργαλείο στο οποίο μπορείτε να εξαρτήσετε μια κυκλοφορία.
|
|
377
|
-
|
|
378
|
-
**Πόσο σίγουρο — το επίπεδο τεκμηρίωσης.**
|
|
379
|
-
|
|
380
|
-
| Επίπεδο | Όνομα | Σημαίνει | Αφαίρεση |
|
|
381
|
-
| ------- | ------------------------ | --------------------------------------------------------- | -------- |
|
|
382
|
-
| **E2** | Ντετερμινιστική απόδειξη | Το ελάττωμα υπάρχει στον κώδικα όπως είναι γραμμένος | Πλήρης |
|
|
383
|
-
| **E1** | Τεκμήριο μοτίβου | Ταίριαξε ένα μοτίβο στενά συνδεδεμένο με το ελάττωμα | Μισή |
|
|
384
|
-
| **E0** | Παρατήρηση | Αξίζει να το ξέρετε. Όχι ισχυρισμός ότι κάτι είναι λάθος. | Μηδέν |
|
|
385
|
-
|
|
386
|
-
Η βεβαιότητα μιας ανίχνευσης δεν είναι η ισχύς της απόδειξης. Ένας κανόνας μπορεί να είναι βέβαιος ότι βρήκε αυτό που έψαχνε και παρ' όλα αυτά να κοιτάζει μια ευρετική. Τα ευρήματα E1 υπάρχουν για να διαβάζονται και να κρίνονται, ποτέ για να εφαρμόζονται στα τυφλά, και αυτό το όριο είναι αποτυπωμένο στο εύρημα στο τερματικό, στο JSON και στην παράδοση στον πράκτορα.
|
|
387
|
-
|
|
388
|
-
**Πόσο ελέγχθηκε — το επίπεδο εμπιστοσύνης.** Τα περισσότερα ευρήματα προκύπτουν από την ανάγνωση του κώδικά σας. Δώστε στο Mjölnir την αναφορά μιας πραγματικής εκτέλεσης τεστ και μπορεί να επιβεβαιώσει ότι ο κώδικας όντως εκτελέστηκε.
|
|
389
|
-
|
|
390
|
-
<p align="center">
|
|
391
|
-
<img src="assets/readme/trust-ladder.svg" alt="Η κλίμακα εμπιστοσύνης από L0 έως L5. Τα L0 έως L2 προκύπτουν από την ανάγνωση του κώδικα· τα L3 έως L5 χρειάζονται πραγματική αναφορά εκτέλεσης, κάτι που σημειώνεται με ένα κενό στην κλίμακα." width="100%" />
|
|
392
|
-
</p>
|
|
393
|
-
|
|
394
|
-
| Επίπεδο | Με απλά λόγια | Τι χρειάζεται |
|
|
395
|
-
| ------- | ------------------------- | ------------------------------------------------------------------------------ |
|
|
396
|
-
| **L0** | Σημειώθηκε | Ανάγνωση του κώδικα |
|
|
397
|
-
| **L1** | Μοιάζει με το πρόβλημα | Ανάγνωση του κώδικα: ταίριαξε ένα μοτίβο |
|
|
398
|
-
| **L2** | Αποδεδειγμένο στον κώδικα | Ανάγνωση του κώδικα: το ελάττωμα είναι δομικό |
|
|
399
|
-
| **L3** | Το αρχείο εκτελέστηκε | Μια αναφορά εκτέλεσης δείχνει ότι το αρχείο του ευρήματος εκτελέστηκε |
|
|
400
|
-
| **L4** | Το τεστ εκτελέστηκε | Μια αναφορά εκτέλεσης δείχνει ότι το τεστ του ευρήματος εκτελέστηκε |
|
|
401
|
-
| **L5** | Η εκτέλεση συμφωνεί | Το ίδιο το αποτέλεσμα της εκτέλεσης επιβεβαιώνει την κατηγορία του ελαττώματος |
|
|
402
|
-
|
|
403
|
-
Μια στατική σάρωση σταματά στο L2. Μόνο μια πραγματική αναφορά εκτέλεσης (Playwright JSON, Jest ή Vitest JSON, JUnit XML) μπορεί να ανεβάσει ένα εύρημα στο L3 ή παραπάνω, οπότε ένα εύρημα που δεν εθεάθη ποτέ να εκτελείται δεν μπορεί ποτέ να ισχυριστεί ότι εκτελέστηκε. Ορισμοί: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
|
|
404
|
-
|
|
405
|
-
### Πόσο από αυτό είναι μετρημένο
|
|
406
|
-
|
|
407
|
-
**74 από 79 κανόνες έχουν ποσοστό ψευδώς θετικών μετρημένο σε πραγματικό κώδικα OSS** (τουλάχιστον 10 ευρήματα ταξινομημένα με το χέρι ο καθένας· δείτε το [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Οι υπόλοιποι 5 βασίζονται στην εκτίμηση του δημιουργού και το δηλώνουν, κανόνα προς κανόνα, στο `mjolnir explain`. Το `mjolnir rules --unmeasured` τους απαριθμεί, και το υποσέλιδο κάθε σάρωσης αναφέρει πόσοι από τους κανόνες που πράγματι _ενεργοποιήθηκαν_ είναι μετρημένοι.
|
|
408
|
-
|
|
409
|
-
Τα ποσοστά παραμένουν δημόσια ακόμη κι όταν είναι κακά. Ο QA-TEST-001 (ένα `.only` σε commit) τα πάει άσχημα στον έλεγχο σε πραγματικά αποθετήρια και γι' αυτό βρίσκεται σε quarantine. Ο τρέχων αριθμός για κάθε κανόνα, μαζί με τον QA-PW-141, βρίσκεται στον έλεγχο.
|
|
410
|
-
|
|
411
|
-
### Επίπεδα εμπιστοσύνης κανόνων
|
|
412
|
-
|
|
413
|
-
Τα επίπεδα ακολουθούν το μετρημένο ποσοστό ψευδώς θετικών, όχι γνώμες:
|
|
414
|
-
|
|
415
|
-
| Επίπεδο | Μετρημένο FP | Συμπεριφορά |
|
|
416
|
-
| --------------- | --------------------- | --------------------------------------------------------- |
|
|
417
|
-
| **core** | ≤ 10% | Προεπιλεγμένη αναφορά, μπλοκάρει |
|
|
418
|
-
| **extended** | ≤ 30% | Προεπιλεγμένη αναφορά, χαμηλότερη βεβαιότητα |
|
|
419
|
-
| **quarantine** | > 30% ή ρητά δηλωμένο | Μόνο `--strict`, περιορισμένο σε info, δεν μπλοκάρει ποτέ |
|
|
420
|
-
| _μη μετρημένος_ | n < 10 | Δεν μπορεί να προαχθεί σε core μέχρι να μετρηθεί |
|
|
421
|
-
|
|
422
|
-
Οι ζώνες FP μπορούν μόνο να υποβιβάσουν ένα επίπεδο — δεν προάγουν ποτέ έναν κανόνα εκτός `quarantine` αν έχει δηλωθεί ρητά εκεί. Ένας ρητά τεθείς σε καραντίνα κανόνας παραμένει στο quarantine ανεξαρτήτως του μετρημένου ποσοστού FP.
|
|
423
|
-
|
|
424
|
-
Προαγωγή, υποβιβασμός και ωριμότητα ανά γλώσσα: [κύκλος ζωής των κανόνων](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
|
|
425
|
-
|
|
426
|
-
### Γιατί αυτό δεν είναι linter
|
|
427
|
-
|
|
428
|
-
Οι linters σάς λένε αν ο κώδικας ακολουθεί κανόνες. Το Mjölnir σάς λέει αν μπορείτε να εμπιστευτείτε την επαλήθευσή σας.
|
|
429
|
-
|
|
430
|
-
| | Linters (ESLint, SonarQube) | Εργαλεία κάλυψης | Έλεγχος κώδικα με ΤΝ | **Mjölnir** |
|
|
431
|
-
| -------------------------------------------------------------------------- | :-------------------------: | :--------------: | :------------------: | :----------------: |
|
|
432
|
-
| Βαθμολογεί το **σύστημα επαλήθευσης**, όχι τον κώδικα του προϊόντος | Όχι | Όχι | Όχι | Ναι |
|
|
433
|
-
| Ακεραιότητα των CI workflows (`continue-on-error`, `\|\| true`) | Όχι | Όχι | μόνο το diff | Ναι |
|
|
434
|
-
| Βαθμολογεί την ανθεκτικότητα των locators του Playwright (Selector Health) | Όχι | Όχι | Όχι | Ναι |
|
|
435
|
-
| Διαβάζει πραγματικά δεδομένα εκτελέσεων για ετυμηγορίες `TRUE-FLAKE` | Όχι | Όχι | Όχι | Ναι |
|
|
436
|
-
| Δημοσιεύει μετρημένο ποσοστό ψευδώς θετικών ανά κανόνα | Όχι | Όχι | Όχι | Ναι |
|
|
437
|
-
| Σημειώνει τεστ χωρίς ισχυρισμούς | Ναι\* | Όχι | μερικές φορές | Ναι |
|
|
438
|
-
| Εντοπίζει σταθερά sleep (`waitForTimeout`, `time.sleep`) | Ναι\* | Όχι | μερικές φορές | Ναι |
|
|
439
|
-
| Ντετερμινιστικό (ίδια είσοδος, ίδια έξοδος) | Ναι | Ναι | Όχι | Ναι |
|
|
440
|
-
| Κόστος ανά σάρωση | δωρεάν | δωρεάν | tokens | **μηδέν** (τοπικά) |
|
|
441
|
-
|
|
442
|
-
<sub>\*Καλύπτεται από τα `eslint-plugin-jest` και `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) και από τους δικούς κανόνες ισχυρισμών του SonarQube. Οι στήλες περιγράφουν την προεπιλεγμένη συμπεριφορά για την επαλήθευση σουιτών τεστ· πρόσθετα, επί πληρωμή πλάνα και προσαρμοσμένοι κανόνες αλλάζουν ορισμένες απαντήσεις. Αυτή είναι μια σύνοψη τοποθέτησης, όχι benchmark.</sub>
|
|
443
|
-
|
|
444
|
-
Χρησιμοποιήστε και έλεγχο με ΤΝ. Πιάνει αποχρώσεις, πρόθεση και σχεδιαστικά λάθη που κανένα μοτίβο δεν μπορεί να βρει. Το Mjölnir πιάνει ό,τι ξεφεύγει από τον έλεγχο με ΤΝ επειδή φαίνεται σκόπιμο: ένα `.only` σε commit, έναν καταπιωμένο κωδικό εξόδου, ένα `continue-on-error` σε job τεστ. Αυτά χρειάζονται σάρωση, όχι συλλογισμό.
|
|
445
|
-
|
|
446
|
-
<br />
|
|
447
|
-
|
|
448
|
-
## Ανάλυση εκτελέσεων τεστ
|
|
449
|
-
|
|
450
|
-
Η στατική ανάλυση συλλογίζεται για κώδικα που δεν εκτελέστηκε ποτέ. Η ανάλυση εκτελέσεων διαβάζει τι πραγματικά συνέβη: Playwright JSON, Jest JSON, Vitest JSON και JUnit XML από οποιονδήποτε runner.
|
|
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` δεν σημαίνει ότι το τεστ επαναλήφθηκε. Σημαίνει ότι το τεστ **απέτυχε σε τουλάχιστον μία προσπάθεια και μετά τελείωσε πράσινο**: μια τυχερή επιτυχία, που σημειώνεται ό,τι κι αν λέει το τελικό τικ. Το `mjolnir triage` μετατρέπει αυτό το ιστορικό σε πρόταση καραντίνας και το `mjolnir pw-report` συνοψίζει μια εκτέλεση. Οι ίδιες αναφορές εκτέλεσης είναι αυτές που ανεβάζουν τα ευρήματα στα επίπεδα εμπιστοσύνης L3 και πάνω.
|
|
468
|
-
|
|
469
|
-
<br />
|
|
470
|
-
|
|
471
|
-
## Ακεραιότητα CI
|
|
472
|
-
|
|
473
|
-
Ένα τεστ μπορεί να περνά ενώ το pipeline γύρω του δεν μπορεί να αποτύχει. Το Mjölnir διαβάζει και τα workflows: `continue-on-error`, `|| true`, κωδικούς εξόδου που δεν μεταφέρονται ποτέ, steps που πετυχαίνουν πάντα, αναφορές που καταναλώνονται αλλά δεν δημιουργούνται ποτέ, και πύλες που παραλείπονται ακριβώς στα γεγονότα που θα έπρεπε να μπλοκάρουν. Κάθε εύρημα κατονομάζει το job, το step και τη γραμμή, και φέρει το δικό του επίπεδο τεκμηρίωσης.
|
|
474
|
-
|
|
475
|
-
Δημιουργήστε το workflow για PR, συμβουλευτικό από προεπιλογή:
|
|
476
|
-
|
|
477
|
-
```bash
|
|
478
|
-
mjolnir ci install
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
Ή προσθέστε το action του Marketplace σε ένα workflow που ήδη έχετε:
|
|
482
|
-
|
|
483
|
-
```yaml
|
|
484
|
-
- uses: Sergey-Bar/Mjolnir@v3
|
|
485
|
-
with:
|
|
486
|
-
scope: changed
|
|
487
|
-
fail-on: error
|
|
488
|
-
```
|
|
489
|
-
|
|
490
|
-
Καρφιτσώστε το `@v3` για να ακολουθείτε την κύρια γραμμή, ή ένα ακριβές tag (`@v0.5.32`) για αναπαραγώγιμη πύλη. Το [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) καλύπτει το Marketplace, το Smithery και τα μητρώα MCP.
|
|
491
|
-
|
|
492
|
-
Για να στείλετε τα ευρήματα στο GitHub Code Scanning, ανεβάστε SARIF (απαιτεί `security-events: write` σε επίπεδο workflow ή job):
|
|
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
|
-
Στο GitLab, το `--format codequality` γράφει την αναφορά Code Quality που διαβάζουν το widget του MR και οι σημειώσεις του diff ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Ρύθμιση επεξεργαστή και pipeline: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
|
|
504
|
-
|
|
505
|
-
### Απόδοση στο εύρος των αλλαγών
|
|
506
|
-
|
|
507
|
-
```bash
|
|
508
|
-
npx mjolnir-qa@3.0.0 --scope changed
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
Τα ευρήματα αποδίδονται στις γραμμές που πρόσθεσε το branch σας, μετρημένες ως προς το **merge-base**. Το εύρος είναι το ίδιο σύνολο αρχείων που ανακαλύπτει μια πλήρης σάρωση (specs TS/JS και ρυθμίσεις adapters, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`), συν τις αλλαγές χωρίς commit και τις μη παρακολουθούμενες, οπότε λειτουργεί πριν κάνετε commit. Η βάση επιλύεται με τη σειρά `main → master → origin/main → origin/master → origin/HEAD`· αντικαταστήστε τη με `--base <ref>`.
|
|
512
|
-
|
|
513
|
-
Όταν το merge-base δεν μπορεί να επιλυθεί (ρηχός κλώνος, αποσυνδεδεμένο HEAD, στόχος εκτός git), τα ευρήματα επιστρέφουν σε απόδοση σε ολόκληρο το αρχείο **και η αναφορά το λέει.** Μια σιωπηλή εναλλακτική θα ήταν ακριβώς το είδος ελαττώματος που υπάρχει αυτό το εργαλείο για να πιάνει.
|
|
514
|
-
|
|
515
|
-
<br />
|
|
516
|
-
|
|
517
|
-
## Πράκτορες ΤΝ
|
|
518
|
-
|
|
519
|
-
Τα ευρήματα αξίζουν κάτι μόνο αν κάτι ενεργεί με βάση αυτά.
|
|
520
|
-
|
|
521
|
-
```text
|
|
522
|
-
SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
**Η ΤΝ γράφει τη διόρθωση. Το Mjölnir την επαληθεύει.** Η απόδειξη προέρχεται από τη νέα σάρωση, ποτέ από την αναφορά επιτυχίας του ίδιου του πράκτορα.
|
|
526
|
-
|
|
527
|
-
| Εντολή | Τι παίρνει ο πράκτορας |
|
|
528
|
-
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
529
|
-
| `mjolnir mcp` | Ένας διακομιστής [MCP](https://modelcontextprotocol.io) μέσω stdio. Τα `scan`, `explain` και `diff` γίνονται εργαλεία που καλούνται. |
|
|
530
|
-
| `mjolnir handoff` | Μια αποθηκευμένη αναφορά `--json` γίνεται ντετερμινιστικό σχέδιο σε Markdown: τι εντοπίστηκε, το όριο τεκμηρίωσης ανά εύρημα, τι **δεν** πρέπει να αλλάξει, πώς να επαληθευτεί. |
|
|
531
|
-
| `mjolnir install` | Γράφει στις επιφάνειες πρακτόρων που ήδη έχει το αποθετήριό σας (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`), ώστε ο πράκτορας να ξανασαρώνει πριν δηλώσει ότι τελείωσε. |
|
|
532
|
-
|
|
533
|
-
Προσθέστε το σε έναν client που έχει δικό του CLI:
|
|
534
|
-
|
|
535
|
-
```bash
|
|
536
|
-
claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
Ή σε οποιονδήποτε client δέχεται ένα μπλοκ `mcpServers`:
|
|
540
|
-
|
|
541
|
-
```json
|
|
542
|
-
{
|
|
543
|
-
"mcpServers": {
|
|
544
|
-
"mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@3.0.0", "mcp"] }
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
```
|
|
548
|
-
|
|
549
|
-
**Το προστατευτικό κιγκλίδωμα μετράει περισσότερο από την ευκολία.** Κάθε εύρημα σε μια παράδοση φέρει το όριό του. Το **E2** λέει _ντετερμινιστικό: ελέγξτε τη θέση και εφαρμόστε τη διόρθωση_. Το **E1** λέει _ΑΠΑΙΤΕΙΤΑΙ ΕΠΙΒΕΒΑΙΩΣΗ: η παρατήρηση από μόνη της δεν αποδεικνύει το ελάττωμα_. Ένας πράκτορας που διορθώνει τυφλά ένα E1, καταστέλλει έναν κανόνα ή τροποποιεί έναν κανόνα για να ανεβάσει τη βαθμολογία κάνει ακριβώς αυτό που υπάρχει αυτό το εργαλείο για να πιάνει, γι' αυτό η παράδοση το λέει στο prompt, δίπλα στο εύρημα.
|
|
550
|
-
|
|
551
|
-
<br />
|
|
552
|
-
|
|
553
|
-
## Εμπιστοσύνη και ασφάλεια
|
|
554
|
-
|
|
555
|
-
**Τοπικά πρώτα, μηδενική τηλεμετρία.** Κανένα API με δυνατότητα δικτύου (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket) δεν υπάρχει πουθενά στο `src/`, και το [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) αποτυγχάνει το build αν εμφανιστεί κάποιο. Απαγορεύει επίσης τα `eval` και `new Function`. Η σάρωση μη αξιόπιστου κώδικα δεν τον εκτελεί ποτέ: η στατική ανάλυση διαβάζει πηγαίο κείμενο και η ανάλυση εκτελέσεων αναλύει αρχεία αναφορών που ήδη υπάρχουν στον δίσκο.
|
|
556
|
-
|
|
557
|
-
Δύο επιφυλάξεις: το ίδιο το `npx` κατεβάζει το πακέτο πριν εκτελεστεί οτιδήποτε, και η εγγύηση καλύπτει το `src/`, όχι πρόσθετα τρίτων.
|
|
558
|
-
|
|
559
|
-
**Τα πρόσθετα δεν εκτελούνται σε sandbox.** Τα πρόσθετα JS (`mjolnir-rules/*.mjs` ή πακέτα npm που αναφέρονται στο `"plugins"`) εκτελούνται με πλήρη δικαιώματα Node, με το ίδιο μοντέλο εμπιστοσύνης όπως τα πρόσθετα του ESLint ή του Vitest. Η φόρτωσή τους είναι ρητή επιλογή **ανά σάρωση**: χωρίς `--enable-plugins` (ή `MJOLNIR_ENABLE_PLUGINS=1`) οι πηγές τους δεν φορτώνονται ποτέ, και μια ειδοποίηση στο stderr απαριθμεί τι παραλείφθηκε. Τα manifests κανόνων σε JSON δεν εκτελούν κώδικα, και τα προθέματα ID των κανόνων core είναι δεσμευμένα, ώστε κανένα πρόσθετο να μην μπορεί να υποδυθεί κάποιον. Αναφέρετε ευπάθειες μέσω του [SECURITY.md](SECURITY.md).
|
|
560
|
-
|
|
561
|
-
**Εκτελείται πάνω στον εαυτό του.** Μια μηχανή εμπιστοσύνης επαλήθευσης δεν έχει καμία αξιοπιστία αν δεν είναι η ίδια επαληθεύσιμη. Κάθε εκτέλεση του CI σαρώνει αυτό το αποθετήριο με το build που παρήγαγε η ίδια εκτέλεση. Η πύλη αποτυγχάνει σε οποιοδήποτε εύρημα σοβαρότητας error, καθώς και σε **μερική** σάρωση ή σε **κανόνα που κατέρρευσε**, γιατί μια κομμένη αυτοσάρωση που δεν αναφέρει τίποτα είναι ακριβώς το ψεύτικο πράσινο που υπάρχει αυτό το έργο για να πιάνει. Το `mjolnir doctor` ελέγχει ξανά τη βάση κανόνων στην ίδια εκτέλεση (τείχος προστασίας fixtures, ειλικρίνεια επιπέδων, το ανώτατο όριο του επιπέδου core), και ένας έλεγχος με αποτέλεσμα INCONCLUSIVE αποτυγχάνει ακριβώς όπως ένας αποτυχημένος. Και οι δύο αναφορές ανεβαίνουν ως artifacts του build.
|
|
562
|
-
|
|
563
|
-
### Κωδικοί εξόδου και το συμβόλαιο μηχανής
|
|
564
|
-
|
|
565
|
-
Παγωμένοι, ώστε να μπορείτε να χτίσετε λογική CI πάνω τους:
|
|
566
|
-
|
|
567
|
-
| Κωδικός εξόδου | Σημασία |
|
|
568
|
-
| -------------- | -------------------------------------------------------------------------------------- |
|
|
569
|
-
| `0` | Καθαρό: κανένα εύρημα στο επίπεδο της πύλης ή πάνω από αυτό |
|
|
570
|
-
| `1` | Ευρήματα στο επίπεδο της πύλης ή πάνω από αυτό |
|
|
571
|
-
| `2` | Μερική σάρωση (εξαντλήθηκε το χρονικό όριο, μη αναγνώσιμα αρχεία). Δεν μπλοκάρει ποτέ. |
|
|
572
|
-
| `10` | Σφάλμα χρήσης (λάθος σημαία, λείπει ο στόχος) |
|
|
573
|
-
| `20` | Εσωτερικό σφάλμα |
|
|
574
|
-
|
|
575
|
-
Το `2` είναι σκόπιμα διαφορετικό από το `0`: μια σάρωση που δεν ολοκληρώθηκε δεν «βρήκε τίποτα». Απλώς δεν τελείωσε την αναζήτηση.
|
|
576
|
-
|
|
577
|
-
Ό,τι καταναλώνει μια μηχανή (αποτελέσματα εργαλείων MCP, `--json`, SARIF 2.1) προέρχεται από ένα κανονικό αποτέλεσμα με εκδοσιοποιημένο σχήμα που **μόνο επεκτείνεται** (`schemaVersion: 1`, `contractVersion: 1`), ώστε κανένας καταναλωτής να μη χρειάζεται να ανασυνθέτει το νόημα από αποδοσμένο κείμενο. Δείτε [το συμβόλαιο μηχανής](docs/machine-contract.md). Τα ID κανόνων (`QA-<FAMILY>-NNN`) είναι αμετάβλητα μόλις κυκλοφορήσουν και δεν επαναχρησιμοποιούνται ποτέ.
|
|
578
|
-
|
|
579
|
-
<br />
|
|
580
|
-
|
|
581
|
-
## Τι δεν μπορεί να σας πει το Mjölnir
|
|
582
|
-
|
|
583
|
-
- **Δεν εκτελεί τα τεστ σας.** Μια καθαρή σάρωση δεν είναι μια σουίτα που περνά.
|
|
584
|
-
- **Δεν μπορεί να σας πει ότι ένας ισχυρισμός είναι _λάθος_.** Το `expect(total).toBe(41)` φαίνεται υγιές. Το Mjölnir βρίσκει τεστ που _δεν μπορούν να αποτύχουν_ και pipelines που _δεν μπορούν να γίνουν κόκκινα_, όχι τεστ που ελέγχουν το λάθος πράγμα.
|
|
585
|
-
- **Δεν αποδεικνύει την επιχειρησιακή ορθότητα.** Τίποτα εδώ δεν λέει ότι το προϊόν σας κάνει αυτό που ζητούσε η απαίτηση.
|
|
586
|
-
- **Ένα 100 δεν αποδεικνύει μια καλή σουίτα.** Το αν η σουίτα σας καλύπτει τον πραγματικό σας κίνδυνο είναι άλλο ερώτημα, και αυτό το εργαλείο δεν το απαντά.
|
|
587
|
-
- **5 από 79 κανόνες βασίζονται σε εκτίμηση**, όχι σε μετρημένο ποσοστό. Ο καθένας το δηλώνει στο δικό του εύρημα.
|
|
588
|
-
- **Το E1 δεν είναι E2.** Τα ευρετικά ευρήματα αξίζει να διαβάζονται, όχι να εφαρμόζονται στα τυφλά.
|
|
589
|
-
- **Ένα άδειο αποθετήριο παίρνει `null`, ποτέ 100.**
|
|
590
|
-
- **Ένα αρχείο με όνομα `*.spec.ts` χωρίς δηλώσεις τεστ δεν μετρά ως κάλυψη.** Ένα αποθετήριο του οποίου τα μόνα αρχεία spec περιέχουν imports ή τύπους (μηδέν κλήσεις `it`/`test`) παίρνει `null`, όχι 100.
|
|
591
|
-
|
|
592
|
-
<br />
|
|
593
|
-
|
|
594
|
-
## Τεκμηρίωση
|
|
595
|
-
|
|
596
|
-
Ο πλήρης ιστότοπος τεκμηρίωσης βρίσκεται στο <https://sergey-bar.github.io/Mjolnir/>.
|
|
597
|
-
|
|
598
|
-
| Έγγραφο | Τι περιέχει |
|
|
599
|
-
| ------------------------------------------------------ | ----------------------------------------------------- |
|
|
600
|
-
| [docs/SCORING.md](docs/SCORING.md) | Κανονικοποίηση βαθμολογίας και στάθμιση τεκμηρίων |
|
|
601
|
-
| [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Κανονικό λεξιλόγιο: μία λέξη ανά έννοια |
|
|
602
|
-
| [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Μετρημένα ποσοστά ψευδώς θετικών και η μέθοδος |
|
|
603
|
-
| [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Καταστάσεις κανόνων, επίπεδα, καταστολή, απόσυρση |
|
|
604
|
-
| [docs/VERSIONING.md](docs/VERSIONING.md) | Πολιτική semver, παγωμένες διεπαφές, κύκλος απόσυρσης |
|
|
605
|
-
| [docs/machine-contract.md](docs/machine-contract.md) | Το κανονικό αποτέλεσμα αναγνώσιμο από μηχανές |
|
|
606
|
-
| [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | Έξοδος SARIF και ρύθμιση επεξεργαστή ή CI |
|
|
607
|
-
| [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: αναφορά Code Quality, συνταγή για MR, πύλη |
|
|
608
|
-
| [docs/rules/](docs/rules/) | Παραγόμενος κατάλογος ανά κανόνα |
|
|
609
|
-
| [CONTRIBUTING.md](CONTRIBUTING.md) | Περιβάλλον ανάπτυξης και ροή συνεισφοράς |
|
|
610
|
-
| [SUPPORT.md](SUPPORT.md) | Πού να ρωτήσετε, να αναφέρετε και να βρείτε βοήθεια |
|
|
611
|
-
| [SECURITY.md](SECURITY.md) | Αναφορά ευπαθειών |
|
|
612
|
-
| [CHANGELOG.md](CHANGELOG.md) | Ιστορικό εκδόσεων |
|
|
613
|
-
|
|
614
|
-
### Κατάσταση
|
|
615
|
-
|
|
616
|
-
**Έκδοση 1.** Το σχήμα JSON και οι κωδικοί εξόδου είναι παγωμένα συμβόλαια. Οι TypeScript και Python έχουν την ευρύτερη μετρημένη κάλυψη. Οι Java και C# είναι νεότερες· διαβάστε τις μέσα από τον [πίνακα ωριμότητας](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle). Τι έρχεται μετά, χωρίς επινοημένες ημερομηνίες: [ο δημόσιος οδικός χάρτης](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
|
|
617
|
-
|
|
618
|
-
### Συνεισφορά
|
|
619
|
-
|
|
620
|
-
Οι νέοι κανόνες είναι η ευκολότερη πρώτη συνεισφορά. Μία εντολή δημιουργεί τον σκελετό του κανόνα με τα fixtures must-fire **και** must-not-fire. Ο κανόνας που δημιουργείται αποτυγχάνει σκόπιμα στα δικά του fixtures μέχρι να γραφτεί πραγματική ανίχνευση, γιατί ένα stub που κυκλοφορεί είναι ένας κανόνας που κανείς δεν μέτρησε:
|
|
621
|
-
|
|
622
|
-
```bash
|
|
623
|
-
mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
|
|
624
|
-
```
|
|
625
|
-
|
|
626
|
-
Το περιβάλλον ανάπτυξης, οι εντολές των μόνιμων πυλών και οι νόμοι anti-creep και τείχους προστασίας fixtures βρίσκονται στο [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
627
|
-
|
|
628
|
-
<br />
|
|
629
|
-
|
|
630
|
-
<div align="center">
|
|
631
|
-
|
|
632
|
-
<img src="assets/readme/closing.svg" alt="Τρέξτε το στο αποθετήριό σας." width="100%" />
|
|
633
|
-
|
|
634
|
-
```bash
|
|
635
|
-
npx mjolnir-qa@3.0.0
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
[Διαβάστε τον οδηγό](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Ιστότοπος τεκμηρίωσης](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
|
|
639
|
-
|
|
640
|
-
<br />
|
|
641
|
-
|
|
642
|
-
Μη ρωτάτε αν πέρασαν τα τεστ.<br />
|
|
643
|
-
Ρωτήστε αν τα τεκμήρια αποδεικνύουν ότι αξίζουν εμπιστοσύνη.
|
|
644
|
-
|
|
645
|
-
<sub>Δημιουργήθηκε από τον [Sergey Bar](https://www.linkedin.com/in/sergeybar/) · Άδεια MIT</sub>
|
|
646
|
-
|
|
647
|
-
</div>
|