mjolnir-qa 2.0.2 → 3.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 +137 -0
- package/README.md +59 -47
- package/dist/cli.d.mts +49 -5
- package/dist/cli.mjs +4299 -542
- package/dist/mcp/stdio.mjs +440 -59
- package/dist/{scan-pipeline-D3Yk2cef.mjs → scan-pipeline-CAH9_Qgh.mjs} +448 -55
- package/dist/scan-pipeline-CRe7-MQn.mjs +2 -0
- package/package.json +20 -5
- package/dist/scan-pipeline-C0ka-RmX.mjs +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,143 @@ once shipped, so this file is the record of what changed between versions.
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- **Advisory-first CI adoption** — `mjolnir ci install` and the root
|
|
17
|
+
GitHub Action now default to non-blocking findings and non-blocking partial
|
|
18
|
+
scans. Blocking remains explicit through `--gate error`, `--gate warning`,
|
|
19
|
+
or `fail-on`.
|
|
20
|
+
- Suppression counts now report matched findings, not configured entries;
|
|
21
|
+
`suppression-gate` evaluates all-tier pre-suppression findings and enforces
|
|
22
|
+
total-count limits.
|
|
23
|
+
- Zero-finding reports no longer claim the suite is clean or that CI is green.
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **Zero-touch PR framework** — Conventional Commits enforcement via
|
|
28
|
+
`commitlint` + `.husky/commit-msg` (scope is mandatory; WIP/fixup/squash
|
|
29
|
+
commits are rejected before they reach the object store); pinned-seed
|
|
30
|
+
property tests (`vitest.property.config.ts`, `tests/scope/property-invariants.spec.ts`
|
|
31
|
+
with a shared `SEED` constant so failures are reproducible); the
|
|
32
|
+
`merge-verify` CI job that runs the full gate on the **merge result**,
|
|
33
|
+
not the PR head, so a green PR that merges into a red `main` is visible
|
|
34
|
+
before it ships; and `scripts/check-ci-local-parity.mjs`, which keeps
|
|
35
|
+
`ci.yml`, `merge-verify.yml` and the local gate exercising the same
|
|
36
|
+
command list. All additive — no frozen surface changed.
|
|
37
|
+
|
|
38
|
+
## [3.0.0] — 2026-09-24
|
|
39
|
+
|
|
40
|
+
### Breaking changes
|
|
41
|
+
|
|
42
|
+
- Trust and execution boundaries are now explicit and bounded. JavaScript/local-rule execution requires the plugin trust gate; output writers reject symlink/traversal targets; JSON, file, cache, and runtime inputs have size budgets; CLI/MCP durations are finite.
|
|
43
|
+
- Saved report and machine-contract consumers now receive completion, scope, evidence, and verdict fields. Incomplete, L0/zero-evidence, and partial states cannot be presented as `WORTHY`.
|
|
44
|
+
- Privileged PR publication is split into a read-only scan job and an artifact-only publisher with commit-bound, paginated `mjolnir-report:v2` upserts.
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- Enterprise threat-model and data-flow artifacts with a strict validator, claim registry with implementation/test/authority/expiry evidence, and a candidate trust manifest/readiness gate.
|
|
49
|
+
- Canonical completion derivation, bounded cache/artifact persistence, run-identity tree binding, same-process concurrency evidence, and deterministic source-scoped self-scan/replay gates.
|
|
50
|
+
- Public-output redaction/escaping across trust reports, job summaries, dashboards, triage, and Playwright reports; atomic artifact writes and release-mode retention controls.
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- Cross-platform CI matrix coverage for Node 22/24 and Linux/macOS/Windows, including clean-checkout candidate-manifest hashing and deterministic self-scans.
|
|
55
|
+
- Partial/degraded scope accounting now distinguishes intentionally excluded fixtures from missed test-like files and propagates reasons through CLI, reports, and machine contracts.
|
|
56
|
+
- Generated blast-radius, demo/video, site, and release evidence is refreshed from the current tree.
|
|
57
|
+
|
|
58
|
+
### Migration
|
|
59
|
+
|
|
60
|
+
- Install `mjolnir-qa@3.0.0` with Node.js `>=22.18`.
|
|
61
|
+
- Use the `@v3` consumer tag after the stable release; use an exact `v3.0.0` tag for reproducible enforcement.
|
|
62
|
+
- Review the new `--enable-plugins` gate, finite `--max-duration` budget, report completion fields, and strict artifact path requirements.
|
|
63
|
+
|
|
64
|
+
### Certification boundary
|
|
65
|
+
|
|
66
|
+
This release is software-complete and locally certified for the declared engineering gates. Trust certification remains `NOT_CERTIFIED` until protected holdout, real-world, platform/consumer, and human authority evidence is supplied.
|
|
67
|
+
|
|
68
|
+
## [2.1.0] — 2026-09-24
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
|
|
72
|
+
- Added seven milestone commands to the public CLI and root help:
|
|
73
|
+
- `mjolnir ci-integrity` validates GitHub/GitLab/Jenkins scan gates and reports non-blocking or disabled candidates.
|
|
74
|
+
- `mjolnir framework-maturity` reports bounded F0–F5 maturity while preserving human calibration authority.
|
|
75
|
+
- `mjolnir suppression-gate` evaluates reasons, expiry, allowlists, total counts, and matched-finding mass suppression.
|
|
76
|
+
- `mjolnir cross-file` reports duplicate test names, shared imports, circular dependencies, and amplified findings.
|
|
77
|
+
- `mjolnir contract-verify` validates machine-contract fields and binds persisted contracts to a fresh scan.
|
|
78
|
+
- `mjolnir trust-trend` persists, deduplicates, and compares trust snapshots.
|
|
79
|
+
- `mjolnir evidence-graph` builds provenance-bearing evidence graphs and supports file/rule queries.
|
|
80
|
+
- Added a zero-touch PR framework: Conventional Commit enforcement, seeded property tests, merge-result verification, and local/CI command-parity checks.
|
|
81
|
+
- Added dedicated, discoverable property and fuzz suites. Fuzz cases use fixed seeds; property tests remain isolated from default coverage collection.
|
|
82
|
+
- Added CI integrity, suppression, contract, provenance, cross-file, and trust regression suites covering malformed input, partial scans, inactive suppressions, and platform-stable exit behavior.
|
|
83
|
+
- Added stable-only `v1`/`v2` action-tag maintenance. RC tags never move stable consumer tags.
|
|
84
|
+
- Added pinned current corpus revisions and local fixture tree revisions. Baseline counts were not rewritten; corpus drift remains an explicit audit failure.
|
|
85
|
+
|
|
86
|
+
### Fixed
|
|
87
|
+
|
|
88
|
+
- Fixed false-green milestone engines:
|
|
89
|
+
- machine-contract verification now compares every contract projection, including optional provenance and forensic verdicts;
|
|
90
|
+
- trust snapshots use caller-provided timestamps instead of an embedded wall clock;
|
|
91
|
+
- suppression mass uses actual matched pre-suppression findings and active suppressions;
|
|
92
|
+
- evidence provenance is derived from real file contents;
|
|
93
|
+
- cross-file dependency analysis uses the requested target root;
|
|
94
|
+
- framework maturity uses the supported F5 ceiling.
|
|
95
|
+
- Fixed persisted contract handling: documents use strict runtime schema validation and are verified against a fresh scan rather than self-attesting.
|
|
96
|
+
- Fixed zero-finding and partial-scan reporting so incomplete or unclassified analysis cannot render as a clean, proven, or merge-ready suite.
|
|
97
|
+
- Fixed CI workflow audit parsing to fail closed for dynamic conditions, `continue-on-error`, negated commands, multi-pipe status masking, inactive GitLab rules, advisory `after_script` commands, and missing blocking scans.
|
|
98
|
+
- Fixed the coverage job/ratchet mismatch: merge verification now generates the coverage summary it enforces.
|
|
99
|
+
- Fixed stress determinism by normalizing both analysis and machine-contract duration fields, running real concurrent scans, and making the 10k workflow validate JSON even when findings are advisory.
|
|
100
|
+
- Fixed property/fuzz discovery and workflow trigger/name so required PR checks are actually produced.
|
|
101
|
+
- Fixed root help, command registry, README, and release documentation drift for the new command surface.
|
|
102
|
+
|
|
103
|
+
### Security
|
|
104
|
+
|
|
105
|
+
- The composite Action and generated CI surfaces use exact released versions, immutable action references, least-privilege permissions, and explicit exit semantics.
|
|
106
|
+
- The composite Action defaults to blocking on findings and partial scans; advisory behavior requires an explicit opt-out.
|
|
107
|
+
- Release publication is isolated from `main`, uses audited artifacts, npm OIDC trusted publishing with provenance, npm 11.5.1+, a `next` RC dist-tag, and verified GitHub prerelease assets.
|
|
108
|
+
- Pull-request shell inputs and workflow-derived values are passed through environment variables instead of direct `${{ }}` interpolation.
|
|
109
|
+
- Machine-contract, suppression-policy, roadmap, and persisted-artifact validation now reject malformed and adversarial inputs rather than fabricating or trusting them.
|
|
110
|
+
- Main-branch deletion and the complete required PR check matrix are enforced by repository ruleset `01`. The repository is solo-maintained, so the owner explicitly chose not to require a second approving review.
|
|
111
|
+
|
|
112
|
+
### Performance
|
|
113
|
+
|
|
114
|
+
- Centralized deterministic CLI timing normalization and expanded replay, soak, and concurrent stress coverage.
|
|
115
|
+
- Added bounded corpus scans, exact source revisions, and fail-closed baseline provenance checks.
|
|
116
|
+
- Added practical pipeline/command regression tests without changing the frozen 96% branch ratchet.
|
|
117
|
+
|
|
118
|
+
### Testing
|
|
119
|
+
|
|
120
|
+
- Full instrumented release gate: 408 test files, 10,351 passing tests, one expected failure documenting the outstanding orphan corpus baseline, and five intentional skips.
|
|
121
|
+
- Coverage ratchet at release: 98.58% statements, 96.00% branches, 99.38% functions, and 98.84% lines.
|
|
122
|
+
- Focused gates green: build, lint, typecheck, certification, property, fuzz, stress/soak/concurrency, release/workflow contract tests, pack audit, brand, site, and local/CI parity.
|
|
123
|
+
- Historical failed runs remain historical evidence; they are not retroactively changed.
|
|
124
|
+
|
|
125
|
+
### Changed
|
|
126
|
+
|
|
127
|
+
- `ci-local` now runs one complete instrumented suite plus property/fuzz/ratchet/audit/brand/site/parity gates instead of silently omitting release checks.
|
|
128
|
+
- Release promotion is explicit and branch/tag based; merging the version PR does not itself publish npm.
|
|
129
|
+
- Suppression counts and governance outputs distinguish configured, active, expired, and matched findings.
|
|
130
|
+
- Rule IDs remain immutable across the 2.x line. Existing detector contracts,
|
|
131
|
+
including `QA-PW-001`, retain their identity while framework maturity and
|
|
132
|
+
evidence quality improve around them.
|
|
133
|
+
- The CLI command registry is shared by help, dispatch, and CI-integrity classification.
|
|
134
|
+
|
|
135
|
+
### Breaking changes
|
|
136
|
+
|
|
137
|
+
- The package now requires Node.js `>=22.18`.
|
|
138
|
+
- Direct composite-Action consumers now get blocking defaults for findings and partial scans unless they explicitly opt out.
|
|
139
|
+
- Generated CI installation remains opt-in/advisory for first adoption; use `mjolnir ci install --gate error` when an enforcing install is required.
|
|
140
|
+
- Stable release publication no longer occurs automatically from `main`; use the protected release branch and release workflow.
|
|
141
|
+
- The historical `v2.0.3` tag is retained unchanged. This release does not move, delete, or republish that tag.
|
|
142
|
+
|
|
143
|
+
### Migration
|
|
144
|
+
|
|
145
|
+
1. Install or invoke `mjolnir-qa@2.1.0` with Node.js 22.18 or newer.
|
|
146
|
+
2. Replace floating Action versions with `@v2` or the exact `v2.1.0` tag when reproducible enforcement is required.
|
|
147
|
+
3. Review suppression expiry/allowlist policy before enabling `suppression-gate`; existing entries are policy data, not proof of human validation.
|
|
148
|
+
4. Run the seven new commands in report mode first and review their JSON before making them release gates.
|
|
149
|
+
5. Adjudicate remaining corpus count/orphan drift and human/design-partner validation separately; this release does not claim those are closed.
|
|
150
|
+
|
|
14
151
|
## [2.0.2] — 2026-09-22
|
|
15
152
|
|
|
16
153
|
### Fixed
|
package/README.md
CHANGED
|
@@ -150,6 +150,17 @@ FP risk: low (author estimate)
|
|
|
150
150
|
Languages: yaml
|
|
151
151
|
Frameworks: github-actions, azure-pipelines
|
|
152
152
|
|
|
153
|
+
COPY-READY REVIEW COMMENT
|
|
154
|
+
Advisory finding — this does not block merging: Job `security-scan` runs a
|
|
155
|
+
verification gate under `continue-on-error: true`.
|
|
156
|
+
Why it weakens verification: This job can fail every day and CI will still
|
|
157
|
+
show green. The checkmark on this workflow cannot be trusted.
|
|
158
|
+
Confidence: high, evidence E2, tier quarantine; measured FP 11% (19 verdicts).
|
|
159
|
+
Suggested fix: Remove continue-on-error, or scope it to individual
|
|
160
|
+
non-blocking steps only.
|
|
161
|
+
Verify with: mjolnir --scope changed, then mjolnir explain QA-CI-001 if the
|
|
162
|
+
finding still appears.
|
|
163
|
+
|
|
153
164
|
WHAT WAS FOUND (real detector output, not a mockup)
|
|
154
165
|
Job `security-scan` runs a verification gate under `continue-on-error: true`.
|
|
155
166
|
|
|
@@ -197,30 +208,26 @@ Three steps to trust your release pipeline:
|
|
|
197
208
|
2. **Block in CI** — `npx mjolnir-qa@latest --scope changed` — scans only changed lines, blocks PRs with error findings
|
|
198
209
|
3. **Fix and re-verify** — `mjolnir fix` applies safe auto-fixes, then re-scans to prove each one landed
|
|
199
210
|
|
|
200
|
-
|
|
211
|
+
Install the advisory PR workflow first, so existing trust debt cannot break
|
|
212
|
+
CI on day one:
|
|
201
213
|
|
|
202
214
|
```bash
|
|
203
|
-
|
|
215
|
+
mjolnir ci install
|
|
204
216
|
```
|
|
205
217
|
|
|
206
|
-
|
|
218
|
+
After reviewing the findings or baselining existing debt, opt into blocking:
|
|
207
219
|
|
|
208
220
|
```bash
|
|
209
221
|
mjolnir ci install --gate error
|
|
210
222
|
```
|
|
211
223
|
|
|
212
|
-
Run advisory mode only when you want to preview findings without blocking:
|
|
213
|
-
|
|
214
|
-
```bash
|
|
215
|
-
mjolnir ci install --gate advisory
|
|
216
|
-
```
|
|
217
|
-
|
|
218
224
|
| Command | What it does |
|
|
219
225
|
| ----------------------------------- | ----------------------------------------------- |
|
|
220
226
|
| `mjolnir` | Trust Report: verdict, confidence, next action |
|
|
221
227
|
| `mjolnir --scope changed` | Only what your branch introduced (CI form) |
|
|
222
228
|
| `mjolnir --blocking error` | Exit 1 on error findings — gate releases |
|
|
223
|
-
| `mjolnir ci install
|
|
229
|
+
| `mjolnir ci install` | Write the advisory PR workflow (default) |
|
|
230
|
+
| `mjolnir ci install --gate error` | Opt into the blocking PR workflow |
|
|
224
231
|
| `mjolnir business-case` | ROI estimate: projected savings per finding |
|
|
225
232
|
| `mjolnir explain QA-CI-001` | What, why and fix, plus the measured FP rate |
|
|
226
233
|
| `mjolnir why src/a.spec.ts:42` | Why this exact line was flagged. Never gates. |
|
|
@@ -236,30 +243,37 @@ mjolnir ci install --gate advisory
|
|
|
236
243
|
|
|
237
244
|
<br />
|
|
238
245
|
|
|
239
|
-
| Command | What it does
|
|
240
|
-
| ----------------------------------- |
|
|
241
|
-
| `mjolnir --classic` | The pre-Trust-Report score banner render
|
|
242
|
-
| `mjolnir explain verdict` | Why the saved scan's verdict is what it is
|
|
243
|
-
| `mjolnir triage ./test-results/` | Guided triage. Every row ends in a next action.
|
|
244
|
-
| `mjolnir pw-report ./test-results/` | Playwright run summary: retries, flakes, slowest
|
|
245
|
-
| `mjolnir doctor:playwright` | Playwright-only deep scan plus Selector Health Score
|
|
246
|
-
| `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed
|
|
247
|
-
| `mjolnir baseline` / `diff` | Snapshot findings, then report only new or worse
|
|
248
|
-
| `mjolnir impact --since <ref>` | What a commit introduced and resolved
|
|
249
|
-
| `mjolnir summary` | CI annotations and a step summary from a report
|
|
250
|
-
| `mjolnir pr-comment` | A scoped PR comment, as Markdown
|
|
251
|
-
| `mjolnir debt` | Test-debt register with a cost model
|
|
252
|
-
| `mjolnir handover` | Onboarding map of the suite for a new QA engineer
|
|
253
|
-
| `mjolnir init` | Detect frameworks, print a setup checklist
|
|
254
|
-
| `mjolnir suppressions` | List suppressed findings, for governance
|
|
255
|
-
| `mjolnir
|
|
256
|
-
| `mjolnir
|
|
257
|
-
| `mjolnir
|
|
258
|
-
| `mjolnir
|
|
259
|
-
| `mjolnir
|
|
260
|
-
| `mjolnir
|
|
261
|
-
| `mjolnir
|
|
262
|
-
| `mjolnir --
|
|
246
|
+
| Command | What it does |
|
|
247
|
+
| ----------------------------------- | ----------------------------------------------------- |
|
|
248
|
+
| `mjolnir --classic` | The pre-Trust-Report score banner render |
|
|
249
|
+
| `mjolnir explain verdict` | Why the saved scan's verdict is what it is |
|
|
250
|
+
| `mjolnir triage ./test-results/` | Guided triage. Every row ends in a next action. |
|
|
251
|
+
| `mjolnir pw-report ./test-results/` | Playwright run summary: retries, flakes, slowest |
|
|
252
|
+
| `mjolnir doctor:playwright` | Playwright-only deep scan plus Selector Health Score |
|
|
253
|
+
| `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
|
|
254
|
+
| `mjolnir baseline` / `diff` | Snapshot findings, then report only new or worse |
|
|
255
|
+
| `mjolnir impact --since <ref>` | What a commit introduced and resolved |
|
|
256
|
+
| `mjolnir summary` | CI annotations and a step summary from a report |
|
|
257
|
+
| `mjolnir pr-comment` | A scoped PR comment, as Markdown |
|
|
258
|
+
| `mjolnir debt` | Test-debt register with a cost model |
|
|
259
|
+
| `mjolnir handover` | Onboarding map of the suite for a new QA engineer |
|
|
260
|
+
| `mjolnir init` | Detect frameworks, print a setup checklist |
|
|
261
|
+
| `mjolnir suppressions` | List suppressed findings, for governance |
|
|
262
|
+
| `mjolnir ci-integrity` | Verify blocking CI scans and suppression policy |
|
|
263
|
+
| `mjolnir framework-maturity` | Inspect bounded maturity with human calibration |
|
|
264
|
+
| `mjolnir suppression-gate` | Enforce expiry, allowlist, and mass-suppression rules |
|
|
265
|
+
| `mjolnir cross-file` | Analyze duplicate, shared, and circular test signals |
|
|
266
|
+
| `mjolnir contract-verify` | Verify a persisted machine contract artifact |
|
|
267
|
+
| `mjolnir trust-trend` | Persist and compare trust snapshots over time |
|
|
268
|
+
| `mjolnir evidence-graph` | Build or query the verification evidence graph |
|
|
269
|
+
| `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
|
|
270
|
+
| `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
|
|
271
|
+
| `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
|
|
272
|
+
| `mjolnir create-rule <ID>` | Scaffold a new rule and its fixtures |
|
|
273
|
+
| `mjolnir stats` | Local all-time counters of fixes seen |
|
|
274
|
+
| `mjolnir badge` | shields.io endpoint JSON and snippet |
|
|
275
|
+
| `mjolnir --cache` | Incremental re-scans via a local verdict cache |
|
|
276
|
+
| `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
|
|
263
277
|
|
|
264
278
|
`mjolnir help <command>` prints usage, examples and the next step for any
|
|
265
279
|
of them.
|
|
@@ -556,22 +570,20 @@ propagate, always-success steps, reports consumed but never generated, and
|
|
|
556
570
|
gates skipped on the events that should block. Each finding names the job,
|
|
557
571
|
the step and the line, and carries its own evidence level.
|
|
558
572
|
|
|
559
|
-
Generate
|
|
560
|
-
|
|
573
|
+
Generate an advisory PR workflow first. It reports findings without blocking
|
|
574
|
+
and is pinned to this version, so adopting it cannot change gate semantics:
|
|
561
575
|
|
|
562
576
|
```bash
|
|
563
|
-
mjolnir ci install
|
|
577
|
+
mjolnir ci install
|
|
564
578
|
```
|
|
565
579
|
|
|
566
|
-
|
|
567
|
-
semantics without a commit of yours. Switch to advisory only when you want
|
|
568
|
-
to preview findings without blocking:
|
|
580
|
+
After reviewing existing debt, opt into an enforcing gate:
|
|
569
581
|
|
|
570
582
|
```bash
|
|
571
|
-
mjolnir ci install --gate
|
|
583
|
+
mjolnir ci install --gate error
|
|
572
584
|
```
|
|
573
585
|
|
|
574
|
-
In your existing workflow, pin the action and
|
|
586
|
+
In your existing workflow, pin the action and explicitly opt into an error gate:
|
|
575
587
|
|
|
576
588
|
```yaml
|
|
577
589
|
- uses: Sergey-Bar/Mjolnir@4a588bc62d517bc85fc44c0eae64c6587d3bf70b0
|
|
@@ -634,11 +646,11 @@ SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
|
|
|
634
646
|
**AI writes the fix. Mjölnir verifies it.** The proof comes from the
|
|
635
647
|
re-scan, never from the agent's own report of success.
|
|
636
648
|
|
|
637
|
-
| Command | What the agent gets
|
|
638
|
-
| ----------------- |
|
|
639
|
-
| `mjolnir mcp` | An [MCP](https://modelcontextprotocol.io) server over stdio. `scan`, `explain` and `
|
|
640
|
-
| `mjolnir handoff` | A saved `--json` report becomes a deterministic Markdown plan: what was detected, the evidence boundary per finding, what must **not** change, how to verify.
|
|
641
|
-
| `mjolnir install` | Writes into the agent surfaces your repo already has (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) so the agent re-scans before it claims it is done.
|
|
649
|
+
| Command | What the agent gets |
|
|
650
|
+
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
651
|
+
| `mjolnir mcp` | An [MCP](https://modelcontextprotocol.io) server over stdio. `scan`, `explain`, `diff`, `verify`, `forensics`, `triage`, and `pw-report` are read-only callable tools. |
|
|
652
|
+
| `mjolnir handoff` | A saved `--json` report becomes a deterministic Markdown plan: what was detected, the evidence boundary per finding, what must **not** change, how to verify. |
|
|
653
|
+
| `mjolnir install` | Writes into the agent surfaces your repo already has (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) so the agent re-scans before it claims it is done. |
|
|
642
654
|
|
|
643
655
|
Add it to a client that ships its own CLI:
|
|
644
656
|
|
package/dist/cli.d.mts
CHANGED
|
@@ -325,12 +325,15 @@ interface ScanResult {
|
|
|
325
325
|
* truncation actually happened — absence means the scan is whole.
|
|
326
326
|
*/
|
|
327
327
|
truncationReasons?: string[];
|
|
328
|
+
/** Canonical completion reasons, including scope and parser degradation. */
|
|
329
|
+
reasons?: string[];
|
|
328
330
|
/**
|
|
329
331
|
* Rule executions that threw and were swallowed by crash isolation
|
|
330
332
|
* (audit R-9). 0 means no rule silently failed; absence means the
|
|
331
333
|
* producer predates the counter.
|
|
332
334
|
*/
|
|
333
335
|
rulesCrashed?: number;
|
|
336
|
+
parseFallbacks?: number;
|
|
334
337
|
};
|
|
335
338
|
/**
|
|
336
339
|
* Scoring model version stamped into the result (ENGINE-001). Allows
|
|
@@ -378,6 +381,7 @@ interface ScanResult {
|
|
|
378
381
|
trustModelVersion?: string;
|
|
379
382
|
scoringModelVersion?: string;
|
|
380
383
|
frameworkSupportMatrixVersion?: string;
|
|
384
|
+
commit?: string;
|
|
381
385
|
};
|
|
382
386
|
/**
|
|
383
387
|
* Evidence Graph (R4c): the chain-law links (VERDICT ← EVIDENCE ←
|
|
@@ -956,9 +960,9 @@ interface ScanContext {
|
|
|
956
960
|
maxFiles: number;
|
|
957
961
|
/** R4c Scope Integrity: counted matcher exclusions (optional — adapters
|
|
958
962
|
* whose discovery walks sharedWalk pass this through to the counters). */
|
|
959
|
-
onIgnored?: () => void;
|
|
963
|
+
onIgnored?: (path: string) => void;
|
|
960
964
|
/** R4c Scope Integrity: counted files no adapter claims (optional). */
|
|
961
|
-
onUnrecognized?: () => void;
|
|
965
|
+
onUnrecognized?: (path: string) => void;
|
|
962
966
|
/**
|
|
963
967
|
* Called when a rule throws on a file (audit R-9): crash isolation
|
|
964
968
|
* stays silent by default, but the scan counts it and `--debug`
|
|
@@ -1226,6 +1230,8 @@ interface ScanHooks {
|
|
|
1226
1230
|
* never on the stdout machine contracts.
|
|
1227
1231
|
*/
|
|
1228
1232
|
onGateNotice?: (notice: string) => void;
|
|
1233
|
+
onTestFilesDiscovered?: (files: readonly string[]) => void;
|
|
1234
|
+
onPreSuppressionFindings?: (findings: readonly Finding[]) => void;
|
|
1229
1235
|
}
|
|
1230
1236
|
/**
|
|
1231
1237
|
* Workspace fallback for targets with no discoverable project root
|
|
@@ -1289,7 +1295,9 @@ interface FileAnalysisResult {
|
|
|
1289
1295
|
testDeclarationCount: number;
|
|
1290
1296
|
rulesPartial: boolean;
|
|
1291
1297
|
parseFailed: number;
|
|
1298
|
+
parseFallbacks: number;
|
|
1292
1299
|
scanned: number;
|
|
1300
|
+
analyzed: number;
|
|
1293
1301
|
}
|
|
1294
1302
|
declare function runFileAnalysisPhase(findings: Finding[], testFiles: string[], workspace: Workspace, activeRules: UniversalRule[], hooks: ScanHooks, cache: ScanCache, rulesDigest: string, deadline: number, truncationReasons: Set<string>, declarationsByFile: Map<string, number>, fileProvenance: Array<{
|
|
1295
1303
|
path: string;
|
|
@@ -1304,6 +1312,7 @@ interface PostScanResult {
|
|
|
1304
1312
|
suppressionCount: number;
|
|
1305
1313
|
frameworks: ReturnType<typeof detectFrameworks>;
|
|
1306
1314
|
runtimeReportPath: string | undefined;
|
|
1315
|
+
runtimeIncomplete: boolean;
|
|
1307
1316
|
/** Aggregate forensic classifications from the ingested runtime report. */
|
|
1308
1317
|
forensicVerdicts: ForensicVerdictSummary | undefined;
|
|
1309
1318
|
config: ReturnType<typeof loadConfig>["config"];
|
|
@@ -1329,7 +1338,9 @@ interface AssembleScanResultInput {
|
|
|
1329
1338
|
scopeIgnored: number;
|
|
1330
1339
|
scopeUnrecognized: number;
|
|
1331
1340
|
parseFailed: number;
|
|
1341
|
+
parseFallbacks?: number;
|
|
1332
1342
|
scanned: number;
|
|
1343
|
+
analyzed?: number;
|
|
1333
1344
|
testFiles: string[];
|
|
1334
1345
|
workspace: Workspace;
|
|
1335
1346
|
scanRoot: Workspace;
|
|
@@ -1348,6 +1359,7 @@ interface AssembleScanResultInput {
|
|
|
1348
1359
|
suppressionCount: number;
|
|
1349
1360
|
frameworks: ReturnType<typeof detectFrameworks>;
|
|
1350
1361
|
runtimeReportPath: string | undefined;
|
|
1362
|
+
runtimeIncomplete?: boolean;
|
|
1351
1363
|
forensicVerdicts: ForensicVerdictSummary | undefined;
|
|
1352
1364
|
config: ReturnType<typeof loadConfig>["config"];
|
|
1353
1365
|
fileProvenance: Array<{
|
|
@@ -1381,7 +1393,7 @@ declare function runScan$1(args: CliArgs, hooks?: ScanHooks): Promise<ScanResult
|
|
|
1381
1393
|
* scripts/sync-sarif-version.cjs and guarded by the version-consistency
|
|
1382
1394
|
* spec. cli.ts re-exports this as CLI_VERSION.
|
|
1383
1395
|
*/
|
|
1384
|
-
declare const ENGINE_VERSION = "
|
|
1396
|
+
declare const ENGINE_VERSION = "3.0.0";
|
|
1385
1397
|
//#endregion
|
|
1386
1398
|
//#region src/cli-io.d.ts
|
|
1387
1399
|
/**
|
|
@@ -1623,7 +1635,7 @@ export declare function runAnalyzeCommand(argv: string[], io: {
|
|
|
1623
1635
|
export declare function runCiAdapterCommand(argv: string[], io: {
|
|
1624
1636
|
out: Output;
|
|
1625
1637
|
err: Output;
|
|
1626
|
-
}):
|
|
1638
|
+
}): number;
|
|
1627
1639
|
//#endregion
|
|
1628
1640
|
//#region src/commands/dashboard.d.ts
|
|
1629
1641
|
export declare function runDashboardCommand(argv: string[], io: {
|
|
@@ -1643,6 +1655,36 @@ export declare function runMaturityCommand(argv: string[], io: {
|
|
|
1643
1655
|
err: Output;
|
|
1644
1656
|
}): number;
|
|
1645
1657
|
//#endregion
|
|
1658
|
+
//#region src/commands/milestone.d.ts
|
|
1659
|
+
export declare function runFrameworkMaturityCommand(argv: string[], io?: {
|
|
1660
|
+
out: Output;
|
|
1661
|
+
err: Output;
|
|
1662
|
+
}): number;
|
|
1663
|
+
export declare function runSuppressionGateCommand(argv: string[], io?: {
|
|
1664
|
+
out: Output;
|
|
1665
|
+
err: Output;
|
|
1666
|
+
}): Promise<number>;
|
|
1667
|
+
export declare function runCrossFileCommand(argv: string[], io?: {
|
|
1668
|
+
out: Output;
|
|
1669
|
+
err: Output;
|
|
1670
|
+
}): Promise<number>;
|
|
1671
|
+
export declare function runContractVerifyCommand(argv: string[], io?: {
|
|
1672
|
+
out: Output;
|
|
1673
|
+
err: Output;
|
|
1674
|
+
}): Promise<number>;
|
|
1675
|
+
export declare function runTrustTrendCommand(argv: string[], io?: {
|
|
1676
|
+
out: Output;
|
|
1677
|
+
err: Output;
|
|
1678
|
+
}): Promise<number>;
|
|
1679
|
+
export declare function runEvidenceGraphCommand(argv: string[], io?: {
|
|
1680
|
+
out: Output;
|
|
1681
|
+
err: Output;
|
|
1682
|
+
}): Promise<number>;
|
|
1683
|
+
export declare function runCIIntegrityCommand(argv: string[], io?: {
|
|
1684
|
+
out: Output;
|
|
1685
|
+
err: Output;
|
|
1686
|
+
}): Promise<number>;
|
|
1687
|
+
//#endregion
|
|
1646
1688
|
//#region src/cli.d.ts
|
|
1647
1689
|
export declare const runScan: typeof runScan$1, buildUniversalRules: typeof buildUniversalRules$1, fallbackWorkspace: typeof fallbackWorkspace$1, pathMatchesGlob: typeof pathMatchesGlob$1, isValidFindingRecord: typeof isValidFindingRecord$1, discoverAndParseRuntimeReport: typeof discoverAndParseRuntimeReport$1, KNOWN_RULE_IDS: ReadonlySet<string>, OVERLAP_META_BY_RULE_ID: ReadonlyMap<string, OverlapMeta>, EVIDENCE_OVERRIDES: ReadonlyMap<string, string>, SUITE_INVALIDATING_RULE_IDS: ReadonlySet<string>;
|
|
1648
1690
|
/** A usage-error detail: the offending token, when one exists. */
|
|
@@ -1652,6 +1694,8 @@ export interface UsageErrorDetail {
|
|
|
1652
1694
|
/** The flag whose value was rejected (`--tone` for `--tone loud`). */
|
|
1653
1695
|
flag?: string | undefined;
|
|
1654
1696
|
}
|
|
1697
|
+
export declare const DEFAULT_MAX_DURATION_MS = 600000;
|
|
1698
|
+
export declare const MAX_DURATION_MS = 3600000;
|
|
1655
1699
|
export declare function parseArgs(argv: string[], onError?: (detail: UsageErrorDetail) => void): CliArgs | null;
|
|
1656
1700
|
/** Hand-rolled Levenshtein distance (plan M2: no new dependencies). */
|
|
1657
1701
|
export declare function levenshtein(a: string, b: string): number;
|
|
@@ -1695,7 +1739,7 @@ export declare function runSuppressions(io?: {
|
|
|
1695
1739
|
out: Output;
|
|
1696
1740
|
err?: Output;
|
|
1697
1741
|
}): number;
|
|
1698
|
-
export declare function printUsage(print: (s: string) => void): void;
|
|
1742
|
+
export declare function printUsage(print: (s: string) => void, width?: number): void;
|
|
1699
1743
|
export declare function main(argv?: string[], io?: {
|
|
1700
1744
|
out: Output;
|
|
1701
1745
|
err: Output;
|