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.ja.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) | 日本語 | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](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` によって、900 件ではなく 3 件のテストしか実行されなかった
|
|
60
|
-
- ゲートとなるはずの job に付いた `continue-on-error: true`
|
|
61
|
-
- テストコマンドの後ろの `|| true`
|
|
62
|
-
- 何もアサートしない、あるいは本体が空のテスト
|
|
63
|
-
- 本当の失敗を運のいい成功に変えてしまうリトライのラッパー
|
|
64
|
-
- workflow がアップロードしているのに、一度も生成されていないレポート
|
|
65
|
-
- 競合状態を固定の sleep でかろうじて支えている箇所
|
|
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`、空のテスト、リトライの悪用 — は検疫ティアに属します。`--strict` の下でのみ実行され、`info` 重要度に制限されます:フラグを立てますが、決してゲートを閉じません。デフォルトのスキャン(`--strict` なしの `npx mjolnir-qa@3.0.0`)はコアおよび拡張ルールのみをカバーします。アドバイザリレイヤーも欲しい場合は `--strict` を追加してください。
|
|
76
|
-
|
|
77
|
-
Mjölnir は、テストスイート、CI workflow、そして手元にあれば実際の実行レポートを読みます。テストを実行することも、依存関係をインストールすることも、スキャン対象のコードを実行することもありません。そして証拠がないときは、確信をでっち上げずにそう伝えます。
|
|
78
|
-
|
|
79
|
-
| 状況 | Mjölnir の報告内容 |
|
|
80
|
-
| -------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
|
81
|
-
| テスト宣言が見つからない | スコアは `null` で、**UNKNOWN** と表示されます。でっち上げの 100 には決してなりません。 |
|
|
82
|
-
| ベースラインや比較可能なリビジョンがない | **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>このページのために構成し、等倍で表示しています。`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
|
-
CI workflow を持つ小さな Playwright スイート、[`examples/demo-repo`](examples/demo-repo) の実際のスキャンです。点数がどこで失われたかはこちら:
|
|
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="デモ録画の 1 フレーム:ターミナルウィンドウで npx mjolnir-qa@3.0.0 がデモリポジトリをスキャンしている様子" width="900" />
|
|
111
|
-
</a>
|
|
112
|
-
</p>
|
|
113
|
-
|
|
114
|
-
<sub>`npm run docs:video` により実際のスキャンから 1 フレームずつレンダリングしたもので、画面録画ではありません。フレームを選ぶと [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4) が開きます。</sub>
|
|
115
|
-
|
|
116
|
-
</details>
|
|
117
|
-
|
|
118
|
-
### ひとつの検出結果を詳しく見る
|
|
119
|
-
|
|
120
|
-
どの検出結果も 4 つの問いに答えます。どこにあるのか、Mjölnir はどれだけ確信しているのか、そのルールはどれくらいの頻度で誤るのか、そしてどう直すのか。
|
|
121
|
-
|
|
122
|
-
<p align="center">
|
|
123
|
-
<img src="assets/readme/finding-anatomy.svg" alt="デモスキャンの最初の検出結果を、ターミナルが出力するとおりに示し、4 つの部分に印を付けたもの:場所、確信度、ルールの誤りやすさ、修正方法。" 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 では、ブランチが持ち込んだものだけをスキャンしましょう。そうすれば、レガシーなスイートが最初の pull request を埋もれさせることはありません。
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
npx mjolnir-qa@3.0.0 --scope changed
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
`mjolnir ci install` はこれを GitHub Actions の workflow として書き出します。メジャータグ `v3` に固定した [action](https://github.com/Sergey-Bar/Mjolnir#readme) を使います(`--no-action` を付ければ素の `npx`)。ブロックすべきだとあなたが決めるまで、助言的な扱いのままです。
|
|
191
|
-
|
|
192
|
-
| コマンド | 内容 |
|
|
193
|
-
| --------------------------------------------- | ----------------------------------------------------------------- |
|
|
194
|
-
| `mjolnir` | Trust Report:判定、確信度、次のアクション |
|
|
195
|
-
| `mjolnir --scope changed` | ブランチが持ち込んだものだけ(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` | shields.io のエンドポイント JSON とスニペット |
|
|
248
|
-
| `mjolnir --cache` | ローカルの判定キャッシュによる差分再スキャン |
|
|
249
|
-
| `mjolnir --format mermaid` | PR コメント用のテストアーキテクチャ図 |
|
|
250
|
-
|
|
251
|
-
`mjolnir help <command>` は、どのコマンドについても使い方、例、次のステップを出力します。
|
|
252
|
-
|
|
253
|
-
</details>
|
|
254
|
-
|
|
255
|
-
Windows、macOS、Linux 上で **Node.js ≥ 22.18** が必要です。グローバルにインストールしたい場合は `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="あなたのスタックで動きます:ルールがカバーする言語、テストフレームワーク、CI システム(ルールレジストリより)。" width="100%" />
|
|
263
|
-
</p>
|
|
264
|
-
|
|
265
|
-
4 つのファミリー(テストの衛生、テストの品質、Playwright、CI の整合性)にわたる **79 のルール**が、TypeScript と JavaScript、Python、Java、C#、GitHub Actions の YAML を対象とします。Playwright は 4 つのバインディングすべてに対応し、さらに pytest、JUnit、TestNG、NUnit、xUnit、MSTest、Jest、Vitest、Mocha をカバーし、Cypress と Selenium には入門レベルの対応があります。雰囲気をつかむために、そのうち 9 つを示します。
|
|
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 | アサーションのないテスト | error | quarantine |
|
|
273
|
-
| QA-TQUAL-009 | await されていない promise のアサーション | error | quarantine |
|
|
274
|
-
| QA-PW-002 | await されていない locator のアサーション | error | core |
|
|
275
|
-
| QA-PW-004 | 壊れやすい CSS/XPath セレクター | warning | quarantine |
|
|
276
|
-
| QA-PY-002 | スキップされたテスト(`skip`、strict でない `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>を 1 つの表に</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 | 衛生 | アサーションのないテスト | 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 | 品質 | await されていない promise のアサーション | error | quarantine |
|
|
298
|
-
| QA-TQUAL-011 | 品質 | コメントアウトされたテスト | warning | extended |
|
|
299
|
-
| QA-PW-002 | Playwright | await されていない locator のアサーション | error | core |
|
|
300
|
-
| QA-PW-003 | Playwright | `page.pause()` / `test.only()` がコミットされている | 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 | テストを包むリトライのラッパー | 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`、strict でない `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 | Playwright の `waitForTimeout()` による固定の sleep | 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# | `WaitForTimeoutAsync()` による固定の sleep | warning | extended |
|
|
324
|
-
| QA-CS-106 | C# | ロールベースの locator ではなく壊れやすいセレクター | warning | quarantine |
|
|
325
|
-
|
|
326
|
-
Python には QA-PY-001…012(pytest の衛生)と QA-PY-101…108(Python 版 Playwright)もあります。Cypress と Selenium にはそれぞれ 3 つのルールからなるスターターセットがあります。
|
|
327
|
-
|
|
328
|
-
</details>
|
|
329
|
-
|
|
330
|
-
どのルールも must-fire **と** must-not-fire の fixture を備えてリリースされ、自分自身のネガティブ 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)` は今日は通り、誰かがマークアップに触れるまで通り続けます。低いスコアはテストが壊れていると主張するものではなく、誰も維持を約束していないマークアップに依存していることを示すだけです。
|
|
349
|
-
|
|
350
|
-
<br />
|
|
351
|
-
|
|
352
|
-
## 信頼度スコア
|
|
353
|
-
|
|
354
|
-
<p align="center">
|
|
355
|
-
<img src="assets/readme/score-gauge.svg" alt="0 から 100 までの信頼度スケール。マーカーがすべてのスコアを走査します:50 未満は UNWORTHY、50〜79 は NEEDS WORK、80〜99 は WORTHY、100 は FORGED" 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
|
-
どの検出結果にも 2 つのラベルが付きます。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 で止まります。検出結果を L3 以上に引き上げられるのは実際の実行レポート(Playwright JSON、Jest または Vitest JSON、JUnit XML)だけです。したがって、実行されている様子が一度も確認されていない検出結果が、実行されたと主張することはありません。定義:[docs/TERMINOLOGY.md](docs/TERMINOLOGY.md)。
|
|
404
|
-
|
|
405
|
-
### どれだけが実測されているか
|
|
406
|
-
|
|
407
|
-
**79 のルールのうち 74 は、実際の 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 バンドはティアを降格することしかできません — 明示的に `quarantine` に宣言されたルールをそこから昇格させることはありません。明示的に quarantine に置かれたルールは、測定された FP 率に関係なく quarantine のままです。
|
|
423
|
-
|
|
424
|
-
昇格、降格、言語ごとの成熟度:[ルールのライフサイクル](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle)。
|
|
425
|
-
|
|
426
|
-
### なぜこれは linter ではないのか
|
|
427
|
-
|
|
428
|
-
linter は、コードがルールに従っているかを教えてくれます。Mjölnir は、あなたの検証が信頼できるかを教えてくれます。
|
|
429
|
-
|
|
430
|
-
| | linter(ESLint、SonarQube) | カバレッジツール | AI コードレビュー | **Mjölnir** |
|
|
431
|
-
| -------------------------------------------------------- | :-------------------------: | :--------------: | :---------------: | :------------------: |
|
|
432
|
-
| 製品コードではなく、**検証の仕組み**をスコアリングする | いいえ | いいえ | いいえ | はい |
|
|
433
|
-
| CI workflow の整合性(`continue-on-error`、`\|\| true`) | いいえ | いいえ | diff のみ | はい |
|
|
434
|
-
| Playwright の locator の耐久性を評価(Selector Health) | いいえ | いいえ | いいえ | はい |
|
|
435
|
-
| 実際の実行データを読んで `TRUE-FLAKE` を判定 | いいえ | いいえ | いいえ | はい |
|
|
436
|
-
| ルールごとの実測誤検知率を公開 | いいえ | いいえ | いいえ | はい |
|
|
437
|
-
| アサーションのないテストを検出 | はい\* | いいえ | 場合による | はい |
|
|
438
|
-
| 固定の sleep を検出(`waitForTimeout`、`time.sleep`) | はい\* | いいえ | 場合による | はい |
|
|
439
|
-
| 決定論的(同じ入力なら同じ出力) | はい | はい | いいえ | はい |
|
|
440
|
-
| スキャンあたりのコスト | 無料 | 無料 | トークン | **ゼロ**(ローカル) |
|
|
441
|
-
|
|
442
|
-
<sub>\*`eslint-plugin-jest` と `eslint-plugin-playwright`(`expect-expect`、`no-wait-for-timeout`)、および SonarQube 独自のアサーションルールでカバーされます。各列は、テストスイートを検証する際のデフォルトの挙動を示しています。プラグイン、有料プラン、カスタムルールによって一部の答えは変わります。これはポジショニングの概要であって、ベンチマークではありません。</sub>
|
|
443
|
-
|
|
444
|
-
AI レビューも併用してください。AI レビューは、どんなパターンにも見つけられないニュアンス、意図、設計上の欠陥を捉えます。Mjölnir が捉えるのは、意図的に見えるために AI レビューが見落とすものです:コミットされた `.only`、握りつぶされた終了コード、テストの job に付いた `continue-on-error`。こうしたものに必要なのは推論ではなくスキャンです。
|
|
445
|
-
|
|
446
|
-
<br />
|
|
447
|
-
|
|
448
|
-
## 実行時フォレンジック
|
|
449
|
-
|
|
450
|
-
静的解析は、一度も実行されていないコードについて推論します。フォレンジックは、実際に何が起きたかを読みます:どのランナーのものでも、Playwright JSON、Jest JSON、Vitest JSON、JUnit XML に対応します。
|
|
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` は、テストがリトライされたという意味ではありません。そのテストが**少なくとも 1 回の試行で失敗し、その後緑で終わった**という意味です:運による成功であり、最終的なチェックが何を示していても検出されます。`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
|
-
または、既存の workflow に Marketplace の action を追加します:
|
|
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 をアップロードします(workflow または job スコープで `security-events: write` が必要):
|
|
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` が MR ウィジェットと diff のアノテーションが読む Code Quality レポートを書き出します([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** を基準として帰属されます。範囲は完全スキャンが見つけるのと同じファイル集合(TS/JS の spec とアダプターの設定、`test_*.py`、`*Test.java`、`*Tests.cs`、`.github/workflows/*.yml`)に、未コミットおよび未追跡の変更を加えたものなので、コミット前でも使えます。ベースは `main → master → origin/main → origin/master → origin/HEAD` の順で解決され、`--base <ref>` で上書きできます。
|
|
512
|
-
|
|
513
|
-
merge-base を解決できない場合(シャロークローン、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` | stdio 経由の [MCP](https://modelcontextprotocol.io) サーバー。`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
|
-
注意点が 2 つあります:`npx` 自体は何かが実行される前にパッケージを取得します。また、この保証が対象とするのは `src/` であり、サードパーティのプラグインは含みません。
|
|
558
|
-
|
|
559
|
-
**プラグインはサンドボックス化されていません**。JS プラグイン(`mjolnir-rules/*.mjs`、または `"plugins"` に列挙された npm パッケージ)は Node の完全な権限で実行されます。ESLint や Vitest のプラグインと同じ信頼モデルです。読み込みは**スキャンごと**のオプトインです:`--enable-plugins`(または `MJOLNIR_ENABLE_PLUGINS=1`)がなければ、そのソースは決して読み込まれず、stderr の通知がスキップされたものを一覧表示します。JSON のルールマニフェストはコードを実行せず、コアのルール ID の接頭辞は予約されているため、プラグインがコアのルールになりすますことはできません。脆弱性は [SECURITY.md](SECURITY.md) から報告してください。
|
|
560
|
-
|
|
561
|
-
**自分自身にも実行します**。検証の信頼エンジンは、それ自体が検証可能でなければ立場がありません。すべての CI 実行は、その同じ実行が生成したビルドでこのリポジトリをスキャンします。ゲートは、重大度 error の検出結果があれば失敗し、**部分的な**スキャンや**クラッシュしたルール**でも失敗します。何も報告しない途中で打ち切られたセルフスキャンこそ、このプロジェクトが捉えるために存在する偽りの緑だからです。`mjolnir doctor` は同じ実行の中でルールベースを再監査し(fixture ファイアウォール、ティアの誠実さ、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) を参照してください。ルール ID(`QA-<FAMILY>-NNN`)は一度リリースされると変更されず、再利用されることもありません。
|
|
578
|
-
|
|
579
|
-
<br />
|
|
580
|
-
|
|
581
|
-
## Mjölnir が教えてくれないこと
|
|
582
|
-
|
|
583
|
-
- **テストは実行しません**。スキャンがクリーンでも、スイートが通るとは限りません。
|
|
584
|
-
- **アサーションが*間違っている*ことは教えてくれません**。`expect(total).toBe(41)` は健全に見えます。Mjölnir が見つけるのは*失敗しようがない*テストと*赤くなりようがない*パイプラインであって、間違ったものを確認しているテストではありません。
|
|
585
|
-
- **ビジネス上の正しさは証明しません**。ここにあるものは何ひとつ、製品が要件どおりに動くことを示しません。
|
|
586
|
-
- **100 は良いスイートの証明ではありません**。スイートが本当のリスクをカバーしているかどうかは別の問いであり、このツールはそれに答えません。
|
|
587
|
-
- **79 のルールのうち 5 つは見積もりでリリースされています**。実測値ではありません。それぞれ自分の検出結果にそう明記しています。
|
|
588
|
-
- **E1 は E2 ではありません**。ヒューリスティックな検出結果は読む価値はあっても、盲目的に適用する価値はありません。
|
|
589
|
-
- **空のリポジトリのスコアは `null` であり、決して 100 にはなりません。**
|
|
590
|
-
- **テスト宣言のない `*.spec.ts` という名前のファイルは、カバレッジとして数えられません**。spec ファイルが import や型しか含まない(`it`/`test` の呼び出しがゼロの)リポジトリのスコアは、100 ではなく `null` です。
|
|
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
|
-
新しいルールは、最も取り組みやすい最初のコントリビューションです。コマンドひとつで、must-fire **と** must-not-fire の fixture 付きでルールの雛形が作られます。生成されたルールは、実際の検出ロジックが書かれるまで、わざと自分の 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>
|