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.th.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 ค้นหาเทสต์ที่ไม่มีวันล้มเหลวและไปป์ไลน์ที่ไม่มีวันเป็นสีแดง<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) | ไทย | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
|
|
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` ที่ถูกคอมมิตไว้ ทำให้รันเทสต์เพียง 3 ตัวแทนที่จะเป็น 900 ตัว
|
|
60
|
-
- `continue-on-error: true` บน job ที่ควรทำหน้าที่เป็นด่านกั้น
|
|
61
|
-
- `|| true` ต่อท้ายคำสั่งรันเทสต์
|
|
62
|
-
- เทสต์ที่ไม่ได้ตรวจสอบอะไรเลย หรือมีเนื้อหาว่างเปล่า
|
|
63
|
-
- ตัวครอบการรันซ้ำที่เปลี่ยนความล้มเหลวจริงให้กลายเป็นการผ่านแบบฟลุก
|
|
64
|
-
- รายงานที่ workflow อัปโหลดแต่ไม่เคยถูกสร้างขึ้นมาจริง
|
|
65
|
-
- sleep แบบตายตัวที่ประคอง race condition เอาไว้
|
|
66
|
-
|
|
67
|
-
ไม่มีข้อใดทำให้ไปป์ไลน์เป็นสีแดง และทุกข้อดูเหมือนตั้งใจเมื่ออยู่ในการรีวิว นั่นคือเหตุผลที่มันรอดมาได้ นี่คือ 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`, การทดสอบว่าง, การใช้ retry ในทางที่ผิด — อยู่ในชั้นกักกัน ทำงานเฉพาะภายใต้ `--strict` และจำกัดที่ความรุนแรง `info`: ตั้งค่าสถานะ แต่ไม่เคยบล็อก การสแกนเริ่มต้น (`npx mjolnir-qa@3.0.0` โดยไม่มี `--strict`) ครอบคลุมเฉพาะกฎหลักและกฎขยาย เพิ่ม `--strict` เมื่อคุณต้องการชั้นที่ปรึกษาด้วย
|
|
76
|
-
|
|
77
|
-
Mjölnir อ่านชุดเทสต์ CI workflow และรายงานจากการรันจริงหากคุณมี มันไม่รันเทสต์ของคุณ ไม่ติดตั้ง dependency และไม่รันโค้ดที่มันสแกน และเมื่อไม่มีหลักฐาน มันจะบอกตรง ๆ แทนที่จะแต่งความมั่นใจขึ้นมา:
|
|
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 คะแนน จำนวน และ 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) ที่ปักไว้กับแท็กหลัก `v3` (หรือใช้ `npx` ธรรมดาด้วย `--no-action`) มันจะอยู่ในโหมดให้คำแนะนำจนกว่าคุณจะตัดสินใจให้มันบล็อก
|
|
191
|
-
|
|
192
|
-
| คำสั่ง | สิ่งที่ทำ |
|
|
193
|
-
| --------------------------------------------- | -------------------------------------------------------- |
|
|
194
|
-
| `mjolnir` | Trust Report: คำตัดสิน ความมั่นใจ ขั้นตอนถัดไป |
|
|
195
|
-
| `mjolnir --scope changed` | เฉพาะสิ่งที่ branch ของคุณนำเข้ามา (รูปแบบสำหรับ CI) |
|
|
196
|
-
| `mjolnir ci install` | สร้าง PR workflow แบบให้คำแนะนำ (ใช้ 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>` | สิ่งที่คอมมิตหนึ่งนำเข้ามาและแก้ไขไป |
|
|
236
|
-
| `mjolnir summary` | คำอธิบายประกอบ CI และสรุป step จากรายงาน |
|
|
237
|
-
| `mjolnir pr-comment` | คอมเมนต์ PR ที่จำกัดขอบเขต เป็น Markdown |
|
|
238
|
-
| `mjolnir debt` | ทะเบียนหนี้ทางเทสต์พร้อมแบบจำลองต้นทุน |
|
|
239
|
-
| `mjolnir handover` | แผนที่แนะนำชุดเทสต์สำหรับวิศวกร QA คนใหม่ |
|
|
240
|
-
| `mjolnir init` | ตรวจหาเฟรมเวิร์กและพิมพ์รายการตรวจสอบการตั้งค่า |
|
|
241
|
-
| `mjolnir suppressions` | แสดงรายการข้อค้นพบที่ถูกระงับ เพื่อการกำกับดูแล |
|
|
242
|
-
| `mjolnir rules --unmeasured` | กฎที่ทำงานจากการสันนิษฐาน ไม่ใช่จากการวัด |
|
|
243
|
-
| `mjolnir rules --md` | แค็ตตาล็อกกฎฉบับเต็ม (JSON หรือ Markdown) |
|
|
244
|
-
| `mjolnir doctor` | การตรวจสอบตัวเองของฐานกฎของ Mjölnir |
|
|
245
|
-
| `mjolnir create-rule <ID>` | สร้างโครงของกฎใหม่และ fixture ของมัน |
|
|
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 อยากติดตั้งแบบ global หรือไม่? `npm i -g mjolnir-qa` เวอร์ชันขั้นต่ำนี้มาจากชุดเครื่องมือ build (tsdown กำหนดเป้าหมายไว้ที่เวอร์ชันนี้ และไปป์ไลน์รีลีสทำ smoke test กับเวอร์ชันนี้) dependency ตอนรันไม่ต้องการมากกว่านั้น
|
|
256
|
-
|
|
257
|
-
<br />
|
|
258
|
-
|
|
259
|
-
## สิ่งที่ Mjölnir ตรวจพบ
|
|
260
|
-
|
|
261
|
-
<p align="center">
|
|
262
|
-
<img src="assets/readme/stack.svg" alt="ใช้งานได้กับสแตกของคุณ: ภาษา เฟรมเวิร์กเทสต์ และระบบ CI ที่กฎครอบคลุม จากทะเบียนกฎ" width="100%" />
|
|
263
|
-
</p>
|
|
264
|
-
|
|
265
|
-
**79 กฎ** ในสี่ตระกูล ได้แก่ สุขอนามัยของเทสต์ คุณภาพของเทสต์ Playwright และความสมบูรณ์ของ CI ครอบคลุม TypeScript และ JavaScript, Python, Java, C# และ YAML ของ GitHub Actions รองรับ Playwright ครบทั้งสี่ binding รวมถึง 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 | คอมมิตเทสต์ที่โฟกัสไว้ (`.only`, `fit`) | error | quarantine |
|
|
272
|
-
| QA-TEST-003 | เทสต์ที่ไม่มี assertion | error | quarantine |
|
|
273
|
-
| QA-TQUAL-009 | assertion ของ promise ที่ไม่ได้ await | error | quarantine |
|
|
274
|
-
| QA-PW-002 | assertion ของ locator ที่ไม่ได้ await | error | core |
|
|
275
|
-
| QA-PW-004 | selector CSS/XPath ที่เปราะบาง | warning | quarantine |
|
|
276
|
-
| QA-PY-002 | เทสต์ที่ถูกข้าม (`skip`, `xfail` ที่ไม่เข้มงวด) | warning | core |
|
|
277
|
-
| QA-CS-103 | เมธอดเทสต์ที่ไม่มี assertion | 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 | สุขอนามัย | คอมมิตเทสต์ที่โฟกัสไว้ (`.only`, `fit`) | error | quarantine |
|
|
291
|
-
| QA-TEST-002 | สุขอนามัย | เทสต์ที่ถูกข้าม จะยกระดับเป็น `error` หากไม่มีเหตุผลที่ติดตามได้ | warning | quarantine |
|
|
292
|
-
| QA-TEST-003 | สุขอนามัย | เทสต์ที่ไม่มี assertion | 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 | คุณภาพ | 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()` ไว้ | error | core |
|
|
301
|
-
| QA-PW-004 | Playwright | selector 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 | ตัวครอบการรันซ้ำรอบเทสต์ | 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 | ฟังก์ชันเทสต์ที่ไม่มี assertion | 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 | เมธอดเทสต์ที่ไม่มี assertion | error | extended |
|
|
318
|
-
| QA-JV-105 | Java | sleep แบบตายตัวด้วย `waitForTimeout()` ของ Playwright | warning | core |
|
|
319
|
-
| QA-JV-106 | Java | selector ที่เปราะบางแทน 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# | เมธอดเทสต์ที่ไม่มี assertion | error | core |
|
|
323
|
-
| QA-CS-105 | C# | sleep แบบตายตัวด้วย `WaitForTimeoutAsync()` | warning | extended |
|
|
324
|
-
| QA-CS-106 | C# | selector ที่เปราะบางแทน 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` ที่ถูกคอมมิต) ได้ผลตรวจสอบไม่ดีบนรีโพจริงจึงถูกจัดไว้ใน 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 สามารถลดระดับ tier ได้เท่านั้น — จะไม่เลื่อนระดับกฎออกจาก `quarantine` หากกฎนั้นถูกประกาศไว้ที่นั่นอย่างชัดเจน กฎที่ถูก quarantined อย่างชัดเจนจะยังคงอยู่ใน quarantine โดยไม่คำนึงถึงอัตรา FP ที่วัดได้
|
|
423
|
-
|
|
424
|
-
การเลื่อนระดับ การลดระดับ และความพร้อมรายภาษา: [วงจรชีวิตของกฎ](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle)
|
|
425
|
-
|
|
426
|
-
### ทำไมนี่จึงไม่ใช่ linter
|
|
427
|
-
|
|
428
|
-
Linter บอกคุณว่าโค้ดทำตามกฎหรือไม่ Mjölnir บอกคุณว่าการตรวจสอบของคุณเชื่อถือได้หรือไม่
|
|
429
|
-
|
|
430
|
-
| | Linter (ESLint, SonarQube) | เครื่องมือวัด coverage | รีวิวโค้ดด้วย AI | **Mjölnir** |
|
|
431
|
-
| ------------------------------------------------------------- | :------------------------: | :--------------------: | :--------------: | :-------------------: |
|
|
432
|
-
| ให้คะแนน **ระบบการตรวจสอบ** ไม่ใช่โค้ดผลิตภัณฑ์ | ไม่ | ไม่ | ไม่ | ใช่ |
|
|
433
|
-
| ความสมบูรณ์ของ CI workflow (`continue-on-error`, `\|\| true`) | ไม่ | ไม่ | เฉพาะ diff | ใช่ |
|
|
434
|
-
| ให้คะแนนความทนทานของ locator ใน Playwright (Selector Health) | ไม่ | ไม่ | ไม่ | ใช่ |
|
|
435
|
-
| อ่านข้อมูลการรันจริงเพื่อตัดสิน `TRUE-FLAKE` | ไม่ | ไม่ | ไม่ | ใช่ |
|
|
436
|
-
| เผยแพร่อัตราผลบวกลวงที่วัดได้ของแต่ละกฎ | ไม่ | ไม่ | ไม่ | ใช่ |
|
|
437
|
-
| ทำเครื่องหมายเทสต์ที่ไม่มี assertion | ใช่\* | ไม่ | บางครั้ง | ใช่ |
|
|
438
|
-
| จับ sleep แบบตายตัว (`waitForTimeout`, `time.sleep`) | ใช่\* | ไม่ | บางครั้ง | ใช่ |
|
|
439
|
-
| กำหนดแน่นอน (อินพุตเดียวกัน เอาต์พุตเดียวกัน) | ใช่ | ใช่ | ไม่ | ใช่ |
|
|
440
|
-
| ต้นทุนต่อการสแกน | ฟรี | ฟรี | โทเค็น | **ศูนย์** (ในเครื่อง) |
|
|
441
|
-
|
|
442
|
-
<sub>\*ครอบคลุมโดย `eslint-plugin-jest` และ `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) และโดยกฎ assertion ของ SonarQube เอง คอลัมน์ต่าง ๆ อธิบายพฤติกรรมเริ่มต้นสำหรับการตรวจสอบชุดเทสต์ ปลั๊กอิน แพ็กเกจแบบเสียเงิน และกฎที่กำหนดเองจะเปลี่ยนบางคำตอบ นี่เป็นบทสรุปการวางตำแหน่ง ไม่ใช่ benchmark</sub>
|
|
443
|
-
|
|
444
|
-
ใช้การรีวิวด้วย AI ด้วย มันจับรายละเอียดปลีกย่อย เจตนา และข้อบกพร่องด้านการออกแบบที่ไม่มีรูปแบบใดหาเจอ ส่วน Mjölnir จับสิ่งที่การรีวิวด้วย AI มองข้ามเพราะดูเหมือนตั้งใจ: `.only` ที่ถูกคอมมิต รหัสออกที่ถูกกลืน `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 อ่าน workflow ด้วย: `continue-on-error`, `|| true` รหัสออกที่ไม่เคยถูกส่งต่อ step ที่สำเร็จเสมอ รายงานที่ถูกใช้แต่ไม่เคยถูกสร้าง และด่านที่ถูกข้ามในเหตุการณ์ที่ควรบล็อก แต่ละข้อค้นพบระบุ job, step และบรรทัด พร้อมระดับหลักฐานของตัวเอง
|
|
474
|
-
|
|
475
|
-
สร้าง PR workflow ซึ่งเป็นแบบให้คำแนะนำโดยค่าเริ่มต้น:
|
|
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
|
-
ข้อค้นพบถูกระบุไปยังบรรทัดที่ branch ของคุณเพิ่มเข้ามา โดยวัดเทียบกับ **merge-base** ขอบเขตคือชุดไฟล์เดียวกับที่การสแกนเต็มค้นพบ (spec ของ TS/JS และการตั้งค่า adapter, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`) รวมกับการเปลี่ยนแปลงที่ยังไม่คอมมิตและที่ไม่ได้ติดตาม จึงใช้ได้ตั้งแต่ก่อนคอมมิต ฐานถูกหาตามลำดับ `main → master → origin/main → origin/master → origin/HEAD` และแทนที่ได้ด้วย `--base <ref>`
|
|
512
|
-
|
|
513
|
-
เมื่อหา merge-base ไม่ได้ (shallow clone, detached 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 อย่างไม่ไตร่ตรอง ระงับกฎ หรือแก้ไขกฎเพื่อดันคะแนน กำลังทำสิ่งที่เครื่องมือนี้มีไว้จับพอดี ดังนั้นการส่งต่อจึงบอกไว้ใน 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 จะแสดงรายการสิ่งที่ถูกข้าม manifest ของกฎที่เป็น JSON ไม่รันโค้ดใด ๆ และคำนำหน้า ID ของกฎ core ถูกสงวนไว้ เพื่อไม่ให้ปลั๊กอินปลอมตัวเป็นกฎเหล่านั้นได้ รายงานช่องโหว่ผ่าน [SECURITY.md](SECURITY.md)
|
|
560
|
-
|
|
561
|
-
**มันรันกับตัวเอง** เอนจินความเชื่อถือในการตรวจสอบจะไม่มีความน่าเชื่อถือเลย หากตัวมันเองตรวจสอบไม่ได้ ทุกการรัน CI สแกนรีโพนี้ด้วย build ที่การรันเดียวกันนั้นสร้างขึ้น ด่านจะล้มเหลวเมื่อพบข้อค้นพบระดับ error ใด ๆ และเมื่อการสแกนเป็นแบบ **บางส่วน** หรือมี **กฎที่พัง** เพราะการสแกนตัวเองที่ถูกตัดจบและไม่รายงานอะไรเลย ก็คือสีเขียวปลอมที่โปรเจกต์นี้มีไว้จับ `mjolnir doctor` ตรวจสอบฐานกฎซ้ำในการรันเดียวกัน (ไฟร์วอลล์ fixture ความซื่อตรงของระดับ เพดานของระดับ core) และการตรวจที่ได้ผล INCONCLUSIVE จะล้มเหลวเหมือนกับการตรวจที่ล้มเหลวทุกประการ รายงานทั้งสองถูกอัปโหลดเป็นอาร์ติแฟกต์ของ 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) มาจากผลลัพธ์มาตรฐานเดียวภายใต้ schema ที่มีเวอร์ชันและ **ขยายได้ด้วยการเพิ่มเท่านั้น** (`schemaVersion: 1`, `contractVersion: 1`) จึงไม่มีผู้ใช้รายใดต้องสร้างความหมายขึ้นใหม่จากข้อความที่เรนเดอร์แล้ว ดู [สัญญาสำหรับเครื่อง](docs/machine-contract.md) ID ของกฎ (`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` ที่ไม่มีการประกาศเทสต์ไม่นับเป็น coverage** รีโพที่ไฟล์ spec มีเพียง import หรือ type (ไม่มีการเรียก `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** schema ของ 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
|
-
กฎใหม่คือการมีส่วนร่วมครั้งแรกที่ง่ายที่สุด คำสั่งเดียวสร้างโครงของกฎพร้อม fixture แบบ must-fire **และ** must-not-fire กฎที่สร้างขึ้นจะล้มเหลวกับ fixture ของตัวเองโดยเจตนาจนกว่าจะมีการเขียนการตรวจจับจริง เพราะโครงเปล่าที่ถูกปล่อยออกไปคือกฎที่ไม่มีใครวัด:
|
|
621
|
-
|
|
622
|
-
```bash
|
|
623
|
-
mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
|
|
624
|
-
```
|
|
625
|
-
|
|
626
|
-
การตั้งค่าสำหรับพัฒนา คำสั่งด่านถาวร และกฎ anti-creep กับไฟร์วอลล์ fixture อยู่ใน [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>
|