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.he.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 מוצא בדיקות שלא יכולות להיכשל וצינורות CI שלא יכולים להאדים,<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) · [סוכנים](#סוכני-ai) · [אבטחה](#אמון-ואבטחה) · [מגבלות](#מה-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) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.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
|
-
וי ירוק אומר שהצינור לא נכשל. הוא לא אומר שהבדיקות רצו, או שהן יכלו להיכשל. כל אחד מאלה עובר בירוק:
|
|
58
|
-
|
|
59
|
-
- `.only` שנשאר ב-commit והריץ 3 בדיקות במקום 900
|
|
60
|
-
- `continue-on-error: true` על ה-job שהיה אמור לחסום
|
|
61
|
-
- `|| true` אחרי פקודת הבדיקות
|
|
62
|
-
- בדיקה שלא בודקת כלום, או שגוף הבדיקה שלה ריק
|
|
63
|
-
- עטיפת retry שהופכת כישלון אמיתי להצלחה מקרית
|
|
64
|
-
- דוח שה-workflow מעלה אבל אף פעם לא יצר
|
|
65
|
-
- sleep קבוע שמחזיק מצב מרוץ
|
|
66
|
-
|
|
67
|
-
אף אחד מהם לא צובע את הצינור באדום, וכל אחד נראה מכוון בסקירת קוד. בגלל זה הם שורדים. הנה Mjölnir קורא מקרה אמיתי:
|
|
68
|
-
|
|
69
|
-
<p align="center">
|
|
70
|
-
<img src="assets/readme/scan.svg" alt="ה-workflow של ה-CI במאגר ההדגמה, נקרא שורה אחר שורה. Mjölnir מסמן כל ממצא בשורה שדווחה, עם הכלל, מה לא תקין, רמת הראיה ושיעור ה-false positives הנמדד שלו." 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 קורא את חבילת הבדיקות, את ה-workflows של ה-CI, ואם יש לכם, גם את הדוח של ריצה אמיתית. הוא לא מריץ את הבדיקות שלכם, לא מתקין תלויות ולא מריץ את הקוד שהוא סורק. וכשאין לו ראיות, הוא אומר את זה במקום להמציא ביטחון:
|
|
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, וגם את הדוח של ריצה אמיתית כשיש כזה. הוא משקלל כל ממצא לפי רמת הראיה ורמת האמון שלו, כשרק ריצה אמיתית יכולה להגיע ל-L3 עד L5, ומפיק ממצאים, ציון ראוּיוּת ושער CI עם קודי יציאה קפואים. בלולאת הסוכן, ה-AI כותב את התיקון ו-Mjölnir סורק שוב כדי להוכיח אותו." width="880" />
|
|
87
|
-
</p>
|
|
88
|
-
|
|
89
|
-
<sub>עוצב עבור הדף הזה ומוצג ביחס 1:1. נוצר על ידי `npm run docs:readme-brand` ונעול מפני סטייה ב-CI; הציון, הספירות ומזהה הכלל מגיעים מ-[`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 קטנה עם workflow של CI. לכאן הלכו הנקודות שלה:
|
|
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` מדפיס את תיק האמון המלא של כלל, כולל שיעור ה-false positives הנמדד שלו וה-tier שהשיעור הזה זיכה אותו בו:
|
|
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, סרקו רק את מה שהענף הכניס, כדי שחבילת בדיקות ישנה לא תטביע את ה-pull request הראשון שלכם:
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
npx mjolnir-qa@3.0.0 --scope changed
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
`mjolnir ci install` כותב את זה כ-workflow של GitHub Actions, עם ה-[action](https://github.com/Sergey-Bar/Mjolnir#readme) מקובע לתגית הראשית `v3` (או `npx` רגיל עם `--no-action`). הוא נשאר מייעץ עד שתחליטו שהוא צריך לחסום.
|
|
191
|
-
|
|
192
|
-
| פקודה | מה היא עושה |
|
|
193
|
-
| --------------------------------------------- | -------------------------------------------------- |
|
|
194
|
-
| `mjolnir` | Trust Report: פסק דין, רמת ביטחון, הצעד הבא |
|
|
195
|
-
| `mjolnir --scope changed` | רק מה שהענף שלכם הכניס (הצורה ל-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 (ארטיפקט לווידג'ט של ה-MR) |
|
|
219
|
-
| `mjolnir --strict` | מריץ גם כללים ברמת quarantine (סיכון FP גבוה יותר) |
|
|
220
|
-
|
|
221
|
-
<details>
|
|
222
|
-
<summary><strong>כל שאר הפקודות</strong> — מיון בדיקות לא יציבות, דיווח, ממשל</summary>
|
|
223
|
-
|
|
224
|
-
<br />
|
|
225
|
-
|
|
226
|
-
| פקודה | מה היא עושה |
|
|
227
|
-
| ----------------------------------- | ----------------------------------------------------------------------- |
|
|
228
|
-
| `mjolnir --classic` | באנר הציון מלפני ה-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` | סריקות חוזרות אינקרמנטליות בעזרת מטמון פסקי דין מקומי |
|
|
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`. הרף הזה מגיע משרשרת הבנייה (tsdown מכוון אליו וצינור השחרור מריץ מולו בדיקות עשן); תלויות זמן הריצה לא צריכות יותר מזה.
|
|
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 | בדיקה בלי assertions | error | quarantine |
|
|
273
|
-
| QA-TQUAL-009 | assertion על promise בלי await | error | quarantine |
|
|
274
|
-
| QA-PW-002 | assertion על locator בלי await | error | core |
|
|
275
|
-
| QA-PW-004 | סלקטורים שבירים של CSS/XPath | warning | quarantine |
|
|
276
|
-
| QA-PY-002 | בדיקה מדולגת (`skip`, `xfail` לא קפדני) | warning | core |
|
|
277
|
-
| QA-CS-103 | מתודת בדיקה בלי assertions | 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 | היגיינה | בדיקה בלי assertions | error | quarantine |
|
|
293
|
-
| QA-TEST-004 | היגיינה | sleep קבוע (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
|
|
294
|
-
| QA-TEST-006 | היגיינה | שימוש לרעה ב-retry שמסתיר חוסר יציבות | warning | quarantine |
|
|
295
|
-
| QA-TEST-010 | היגיינה | גוף בדיקה ריק | error | quarantine |
|
|
296
|
-
| QA-TQUAL-002 | איכות | assertion טאוטולוגי | error | quarantine |
|
|
297
|
-
| QA-TQUAL-009 | איכות | assertion על promise בלי await | error | quarantine |
|
|
298
|
-
| QA-TQUAL-011 | איכות | בדיקות בהערה | warning | extended |
|
|
299
|
-
| QA-PW-002 | Playwright | assertion על 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 | עטיפות retry סביב בדיקות | 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 | פונקציית בדיקה בלי assertions | error | quarantine |
|
|
313
|
-
| QA-PY-005 | Python | `time.sleep()` בבדיקות | warning | extended |
|
|
314
|
-
| QA-PY-012 | Python | assertion טאוטולוגי | 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 | מתודת בדיקה בלי assertions | 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# | מתודת בדיקה בלי assertions | 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 השלילי של עצמו לא יכול לצאת. זה חומת האש נגד false positives; `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 כללים יש שיעור false positives שנמדד מול קוד 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
|
-
הרמות נקבעות לפי שיעור ה-false positives הנמדד, לא לפי דעה:
|
|
414
|
-
|
|
415
|
-
| רמה | FP נמדד | התנהגות |
|
|
416
|
-
| -------------- | ---------------------- | ------------------------------------------- |
|
|
417
|
-
| **core** | ≤ 10% | דוח ברירת מחדל, חוסם |
|
|
418
|
-
| **extended** | ≤ 30% | דוח ברירת מחדל, ביטחון נמוך יותר |
|
|
419
|
-
| **quarantine** | > 30% או שהוצהר במפורש | רק `--strict`, מוגבל ל-info, אף פעם לא חוסם |
|
|
420
|
-
| _לא נמדד_ | n < 10 | לא יכול לעלות ל-core עד שנמדד |
|
|
421
|
-
|
|
422
|
-
רצועות FP יכולות רק להוריד רמה — הן אף פעם לא מקדמות כלל מתוך `quarantine` אם הוא הוצהר שם במפורש. כלל שהוכנס במפורש ל-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) | כלי כיסוי | סקירת קוד ב-AI | **Mjölnir** |
|
|
431
|
-
| ------------------------------------------------------------ | :---------------------------: | :-------: | :------------: | :-------------: |
|
|
432
|
-
| מדרג את **מערכת האימות**, לא את קוד המוצר | לא | לא | לא | כן |
|
|
433
|
-
| שלמות ה-workflows של ה-CI (`continue-on-error`, `\|\| true`) | לא | לא | רק ה-diff | כן |
|
|
434
|
-
| מדרג את עמידות ה-locators של Playwright (Selector Health) | לא | לא | לא | כן |
|
|
435
|
-
| קורא נתוני ריצה אמיתיים לפסקי דין `TRUE-FLAKE` | לא | לא | לא | כן |
|
|
436
|
-
| מפרסם שיעור false positives נמדד לכל כלל | לא | לא | לא | כן |
|
|
437
|
-
| מסמן בדיקות בלי assertions | כן\* | לא | לפעמים | כן |
|
|
438
|
-
| תופס sleep קבוע (`waitForTimeout`, `time.sleep`) | כן\* | לא | לפעמים | כן |
|
|
439
|
-
| דטרמיניסטי (אותו קלט, אותו פלט) | כן | כן | לא | כן |
|
|
440
|
-
| עלות לסריקה | חינם | חינם | טוקנים | **אפס** (מקומי) |
|
|
441
|
-
|
|
442
|
-
<sub>\*מכוסה על ידי `eslint-plugin-jest` ו-`eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) ועל ידי כללי ה-assertions של SonarQube עצמו. העמודות מתארות את התנהגות ברירת המחדל באימות חבילות בדיקות; תוספים, תוכניות בתשלום וכללים מותאמים משנים חלק מהתשובות. זה סיכום מיצוב, לא benchmark.</sub>
|
|
443
|
-
|
|
444
|
-
השתמשו גם בסקירת AI. היא תופסת ניואנסים, כוונה ופגמי תכנון שאף דפוס לא ימצא. Mjölnir תופס את מה שסקירת AI מפספסת כי זה נראה מכוון: `.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
|
-
בדיקה יכולה לעבור בזמן שהצינור סביבה לא יכול להיכשל. 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` כדי לעקוב אחרי הקו הראשי, או תגית מדויקת (`@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 שהווידג'ט של ה-MR וההערות על ה-diff קוראים ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). הגדרת עורך וצינור: [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
|
-
ממצאים מיוחסים לשורות שהענף שלכם הוסיף, ביחס ל-**merge-base**. ההיקף הוא אותה קבוצת קבצים שסריקה מלאה מגלה (קבצי spec של TS/JS ותצורות adapter, `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
|
-
## סוכני AI
|
|
518
|
-
|
|
519
|
-
ממצאים שווים משהו רק אם משהו פועל לפיהם.
|
|
520
|
-
|
|
521
|
-
```text
|
|
522
|
-
SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
**ה-AI כותב את התיקון. 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
|
-
הוסיפו אותו ללקוח שמגיע עם CLI משלו:
|
|
534
|
-
|
|
535
|
-
```bash
|
|
536
|
-
claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
או לכל לקוח שמקבל בלוק `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 בעיוורון, משתיק כלל או עורך כלל כדי להעלות את הציון עושה בדיוק את מה שהכלי הזה קיים כדי לתפוס, ולכן המסירה אומרת זאת בפרומפט, ליד הממצא.
|
|
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) מכשיל את הבנייה אם מופיע כזה. הוא גם אוסר על `eval` ועל `new Function`. סריקת קוד לא מהימן אף פעם לא מריצה אותו: ניתוח סטטי קורא טקסט מקור, וניתוח הריצות מפענח קובצי דוח שכבר קיימים בדיסק.
|
|
556
|
-
|
|
557
|
-
שתי הסתייגויות: `npx` עצמו מוריד את החבילה לפני שמשהו רץ, והערבות מכסה את `src/`, לא תוספים של צד שלישי.
|
|
558
|
-
|
|
559
|
-
**תוספים לא רצים בארגז חול.** תוספי JS (`mjolnir-rules/*.mjs`, או חבילות npm שמופיעות תחת `"plugins"`) רצים עם הרשאות Node מלאות, אותו מודל אמון כמו תוספים של ESLint או Vitest. טעינתם דורשת הסכמה מפורשת **בכל סריקה**: בלי `--enable-plugins` (או `MJOLNIR_ENABLE_PLUGINS=1`) המקורות שלהם אף פעם לא נטענים, והודעה ב-stderr מפרטת מה דולג. מניפסטים של כללים ב-JSON לא מריצים קוד, והקידומות של מזהי כללי core שמורות כך שתוסף לא יוכל להתחזות לאחד מהם. דווחו על פרצות דרך [SECURITY.md](SECURITY.md).
|
|
560
|
-
|
|
561
|
-
**הוא רץ על עצמו.** למנוע אמון באימות אין שום מעמד אם הוא עצמו לא ניתן לאימות. כל ריצת CI סורקת את המאגר הזה עם הבנייה שאותה ריצה הפיקה. השער נכשל על כל ממצא בחומרת error, וגם על סריקה **חלקית** או על **כלל שקרס**, כי סריקה עצמית קטועה שלא מדווחת כלום היא בדיוק הירוק המזויף שהפרויקט הזה קיים כדי לתפוס. `mjolnir doctor` מבקר מחדש את בסיס הכללים באותה ריצה (חומת ה-fixtures, יושרת הרמות, תקרת רמת ה-core), ובדיקה שתוצאתה INCONCLUSIVE נכשלת בדיוק כמו בדיקה שנכשלה. שני הדוחות מועלים כארטיפקטים של הבנייה.
|
|
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). מזהי כללים (`QA-<FAMILY>-NNN`) אינם ניתנים לשינוי אחרי שיצאו ואף פעם לא ממוחזרים.
|
|
578
|
-
|
|
579
|
-
<br />
|
|
580
|
-
|
|
581
|
-
## מה Mjölnir לא יכול להגיד לכם
|
|
582
|
-
|
|
583
|
-
- **הוא לא מריץ את הבדיקות שלכם.** סריקה נקייה היא לא חבילה שעוברת.
|
|
584
|
-
- **הוא לא יכול להגיד לכם ש-assertion _שגוי_.** `expect(total).toBe(41)` נראה בריא. Mjölnir מוצא בדיקות ש*לא יכולות להיכשל* וצינורות ש*לא יכולים להאדים*, לא בדיקות שבודקות את הדבר הלא נכון.
|
|
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) | שיעורי false positives נמדדים והשיטה |
|
|
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 של עצמו עד שנכתב זיהוי אמיתי, כי שלד שיוצא לאוויר הוא כלל שאף אחד לא מדד:
|
|
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>
|