fallow 3.35.0 → 3.37.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/README.md +1 -1
- package/capabilities.json +25 -9
- package/issue-registry.json +8 -4
- package/package.json +14 -11
- package/rule-pack-schema.json +264 -0
- package/schema.json +43 -17
- package/skills/fallow/SKILL.md +2 -2
- package/skills/fallow/references/cli-reference.md +13 -12
- package/skills/fallow/references/gotchas.md +3 -1
- package/skills/fallow/references/patterns.md +2 -2
- package/types/output-contract.d.ts +176 -59
- package/scripts/lazy-verify.test.js +0 -564
- package/scripts/platform-package.test.js +0 -26
- package/scripts/run-binary.test.js +0 -293
- package/scripts/sentinel-path.test.js +0 -240
- package/scripts/verify-binary.test.js +0 -809
|
@@ -164,6 +164,10 @@ export type AuditWorsened = ("warn" | "error" | "off")
|
|
|
164
164
|
* is decided here.
|
|
165
165
|
*/
|
|
166
166
|
export type GateStatus = ("pass" | "warn" | "fail" | "skipped")
|
|
167
|
+
/**
|
|
168
|
+
* Why a file counts for the `parse-error` gate, other than a parser error.
|
|
169
|
+
*/
|
|
170
|
+
export type GateFileReason = "nesting-too-deep"
|
|
167
171
|
/**
|
|
168
172
|
* Analysis mode stored with baselines, snapshots, audit sides, and impact data.
|
|
169
173
|
*/
|
|
@@ -411,6 +415,7 @@ export type PolicyViolationSeverity = ("error" | "warn")
|
|
|
411
415
|
* The origin of a stale suppression: inline comment or JSDoc tag.
|
|
412
416
|
*/
|
|
413
417
|
export type SuppressionOrigin = ({
|
|
418
|
+
type: "comment"
|
|
414
419
|
/**
|
|
415
420
|
* The issue kind token from the comment (e.g., "unused-exports"), or None for blanket.
|
|
416
421
|
*/
|
|
@@ -432,8 +437,8 @@ is_file_level: boolean
|
|
|
432
437
|
* adopted the field stay byte-compatible. See issue #449.
|
|
433
438
|
*/
|
|
434
439
|
kind_known?: boolean
|
|
435
|
-
type: "comment"
|
|
436
440
|
} | {
|
|
441
|
+
type: "jsdoc_tag"
|
|
437
442
|
/**
|
|
438
443
|
* The name of the export that was tagged.
|
|
439
444
|
*/
|
|
@@ -442,7 +447,6 @@ export_name: string
|
|
|
442
447
|
* Human-authored reason after `--`, when present.
|
|
443
448
|
*/
|
|
444
449
|
reason?: (string | null)
|
|
445
|
-
type: "jsdoc_tag"
|
|
446
450
|
})
|
|
447
451
|
/**
|
|
448
452
|
* Where an override entry was declared. Serialized as the filename label
|
|
@@ -564,66 +568,67 @@ degrades_analysis?: boolean
|
|
|
564
568
|
export type WorkspaceDiagnostic1 = ({
|
|
565
569
|
kind: "undeclared-workspace"
|
|
566
570
|
} | {
|
|
571
|
+
kind: "malformed-package-json"
|
|
567
572
|
/**
|
|
568
573
|
* `serde_json` parse error text.
|
|
569
574
|
*/
|
|
570
575
|
error: string
|
|
571
|
-
kind: "malformed-package-json"
|
|
572
576
|
} | {
|
|
577
|
+
kind: "glob-matched-no-package-json"
|
|
573
578
|
/**
|
|
574
579
|
* The glob pattern that matched the directory.
|
|
575
580
|
*/
|
|
576
581
|
pattern: string
|
|
577
|
-
kind: "glob-matched-no-package-json"
|
|
578
582
|
} | {
|
|
583
|
+
kind: "workspace-glob-outside-root"
|
|
579
584
|
/**
|
|
580
585
|
* The workspace entry, as written in the file.
|
|
581
586
|
*/
|
|
582
587
|
pattern: string
|
|
583
|
-
kind: "workspace-glob-outside-root"
|
|
584
588
|
} | {
|
|
589
|
+
kind: "workspace-pattern-dir-missing"
|
|
585
590
|
/**
|
|
586
591
|
* The workspace pattern, as written in the file.
|
|
587
592
|
*/
|
|
588
593
|
pattern: string
|
|
589
|
-
kind: "workspace-pattern-dir-missing"
|
|
590
594
|
} | {
|
|
591
595
|
kind: "nested-project-root"
|
|
592
596
|
} | {
|
|
597
|
+
kind: "malformed-tsconfig"
|
|
593
598
|
/**
|
|
594
599
|
* JSONC parse error text.
|
|
595
600
|
*/
|
|
596
601
|
error: string
|
|
597
|
-
kind: "malformed-tsconfig"
|
|
598
602
|
} | {
|
|
599
603
|
kind: "tsconfig-reference-dir-missing"
|
|
600
604
|
} | {
|
|
605
|
+
kind: "malformed-pnpm-workspace-yaml"
|
|
601
606
|
/**
|
|
602
607
|
* YAML parse error text.
|
|
603
608
|
*/
|
|
604
609
|
error: string
|
|
605
|
-
kind: "malformed-pnpm-workspace-yaml"
|
|
606
610
|
} | {
|
|
611
|
+
kind: "skipped-large-file"
|
|
607
612
|
/**
|
|
608
613
|
* On-disk size of the skipped file in bytes.
|
|
609
614
|
*/
|
|
610
615
|
size_bytes: number
|
|
611
|
-
kind: "skipped-large-file"
|
|
612
616
|
} | {
|
|
617
|
+
kind: "skipped-minified-file"
|
|
613
618
|
/**
|
|
614
619
|
* On-disk size of the skipped file in bytes.
|
|
615
620
|
*/
|
|
616
621
|
size_bytes: number
|
|
617
|
-
kind: "skipped-minified-file"
|
|
618
622
|
} | {
|
|
619
623
|
kind: "skipped-source-dotdir"
|
|
620
624
|
} | {
|
|
625
|
+
kind: "source-read-failure"
|
|
621
626
|
/**
|
|
622
627
|
* Filesystem or UTF-8 decoding error from `read_to_string`.
|
|
623
628
|
*/
|
|
624
629
|
error: string
|
|
625
|
-
kind: "source-read-failure"
|
|
626
630
|
} | {
|
|
631
|
+
kind: "source-parse-degraded"
|
|
627
632
|
/**
|
|
628
633
|
* Number of parser diagnostics reported for the file.
|
|
629
634
|
*/
|
|
@@ -633,7 +638,12 @@ error_count: number
|
|
|
633
638
|
* the extracted module is a fragment at best.
|
|
634
639
|
*/
|
|
635
640
|
panicked: boolean
|
|
636
|
-
|
|
641
|
+
} | {
|
|
642
|
+
kind: "source-nesting-too-deep"
|
|
643
|
+
/**
|
|
644
|
+
* The bracket nesting cap of the pre-parse scan.
|
|
645
|
+
*/
|
|
646
|
+
limit: number
|
|
637
647
|
} | {
|
|
638
648
|
kind: "bun-lockb-override-resolution-skipped"
|
|
639
649
|
} | {
|
|
@@ -645,8 +655,8 @@ kind: "npm-lock-override-resolution-skipped"
|
|
|
645
655
|
} | {
|
|
646
656
|
kind: "bun-resolutions-shadowed-by-overrides"
|
|
647
657
|
} | {
|
|
648
|
-
cause: PnpmWorkspaceOverridesIgnoredCause
|
|
649
658
|
kind: "pnpm-workspace-overrides-ignored"
|
|
659
|
+
cause: PnpmWorkspaceOverridesIgnoredCause
|
|
650
660
|
} | {
|
|
651
661
|
kind: "node-modules-missing"
|
|
652
662
|
} | {
|
|
@@ -654,6 +664,7 @@ kind: "boundaries-not-configured"
|
|
|
654
664
|
} | {
|
|
655
665
|
kind: "rule-packs-not-configured"
|
|
656
666
|
} | {
|
|
667
|
+
kind: "excluded-by-default-ignore"
|
|
657
668
|
/**
|
|
658
669
|
* The built-in glob that matched, verbatim (for example
|
|
659
670
|
* `** /build/**`).
|
|
@@ -677,22 +688,22 @@ file_count: number
|
|
|
677
688
|
* one matched location out of several.
|
|
678
689
|
*/
|
|
679
690
|
directory_count: number
|
|
680
|
-
kind: "excluded-by-default-ignore"
|
|
681
691
|
} | {
|
|
692
|
+
kind: "no-source-files-analyzed"
|
|
682
693
|
/**
|
|
683
694
|
* Candidate source files the built-in ignore patterns removed from
|
|
684
695
|
* this walk, summed across every pattern. `0` when the walk found no
|
|
685
696
|
* candidate to exclude in the first place.
|
|
686
697
|
*/
|
|
687
698
|
excluded_file_count: number
|
|
688
|
-
kind: "no-source-files-analyzed"
|
|
689
699
|
} | {
|
|
700
|
+
kind: "file-scores-unavailable"
|
|
690
701
|
/**
|
|
691
702
|
* Scoring error text.
|
|
692
703
|
*/
|
|
693
704
|
error: string
|
|
694
|
-
kind: "file-scores-unavailable"
|
|
695
705
|
} | {
|
|
706
|
+
kind: "hotspots-skipped"
|
|
696
707
|
/**
|
|
697
708
|
* Which input stopped it, as a kebab-case token: `not-a-repository`,
|
|
698
709
|
* `no-commits`, `invalid-since` or `churn-file-unreadable`. The set is
|
|
@@ -706,25 +717,25 @@ kind: "file-scores-unavailable"
|
|
|
706
717
|
* remedy for all four.
|
|
707
718
|
*/
|
|
708
719
|
cause: string
|
|
709
|
-
kind: "hotspots-skipped"
|
|
710
720
|
} | {
|
|
721
|
+
kind: "change-coupling-skipped"
|
|
711
722
|
/**
|
|
712
723
|
* Kebab-case token: `shallow-clone` (the fetched history is
|
|
713
724
|
* incomplete) or `too-few-commits` (fewer analyzed commits than the
|
|
714
725
|
* minimum revisions of one file). The set is open.
|
|
715
726
|
*/
|
|
716
727
|
cause: string
|
|
717
|
-
kind: "change-coupling-skipped"
|
|
718
728
|
} | {
|
|
729
|
+
kind: "shallow-clone"
|
|
719
730
|
/**
|
|
720
731
|
* `true` when the run also asked for ownership attribution, which a
|
|
721
732
|
* shallow clone skews further by inflating single-author dominance.
|
|
722
733
|
*/
|
|
723
734
|
ownership_requested: boolean
|
|
724
|
-
kind: "shallow-clone"
|
|
725
735
|
} | {
|
|
726
736
|
kind: "unpinned-clock"
|
|
727
737
|
} | {
|
|
738
|
+
kind: "ownership-unavailable"
|
|
728
739
|
/**
|
|
729
740
|
* Which input failed, as a kebab-case token: `invalid-bot-pattern` or
|
|
730
741
|
* `codeowners-parse-failed`. The set is open.
|
|
@@ -734,21 +745,21 @@ cause: string
|
|
|
734
745
|
* Underlying error text.
|
|
735
746
|
*/
|
|
736
747
|
error: string
|
|
737
|
-
kind: "ownership-unavailable"
|
|
738
748
|
} | {
|
|
749
|
+
kind: "trend-snapshot-unreadable"
|
|
739
750
|
/**
|
|
740
751
|
* Filesystem or JSON error text.
|
|
741
752
|
*/
|
|
742
753
|
error: string
|
|
743
|
-
kind: "trend-snapshot-unreadable"
|
|
744
754
|
} | {
|
|
755
|
+
kind: "trend-group-baseline-unavailable"
|
|
745
756
|
/**
|
|
746
757
|
* Why the groups have no baseline, as a kebab-case token:
|
|
747
758
|
* `snapshot-has-no-groups` or `grouped-by-mismatch`. The set is open.
|
|
748
759
|
*/
|
|
749
760
|
cause: string
|
|
750
|
-
kind: "trend-group-baseline-unavailable"
|
|
751
761
|
} | {
|
|
762
|
+
kind: "plugin-config-unreadable"
|
|
752
763
|
/**
|
|
753
764
|
* The plugin that read the config, as it labels itself:
|
|
754
765
|
* `module-federation` for a standalone `module-federation.config.*`,
|
|
@@ -775,8 +786,8 @@ key: string
|
|
|
775
786
|
* option the message points at.
|
|
776
787
|
*/
|
|
777
788
|
reason: string
|
|
778
|
-
kind: "plugin-config-unreadable"
|
|
779
789
|
} | {
|
|
790
|
+
kind: "plugin-effect-not-modeled"
|
|
780
791
|
/**
|
|
781
792
|
* The plugin that read the config, as it labels itself (`nuxt`).
|
|
782
793
|
*/
|
|
@@ -795,34 +806,51 @@ key: string
|
|
|
795
806
|
* be classified at all. The set is open.
|
|
796
807
|
*/
|
|
797
808
|
reason: string
|
|
798
|
-
kind: "plugin-effect-not-modeled"
|
|
799
809
|
} | {
|
|
800
810
|
kind: "coverage-auto-detected"
|
|
801
811
|
} | {
|
|
802
812
|
kind: "flag-age-shallow-clone"
|
|
803
813
|
} | {
|
|
814
|
+
kind: "flag-age-unavailable"
|
|
804
815
|
/**
|
|
805
816
|
* Why no history is available, as a kebab-case token:
|
|
806
817
|
* `not-a-repository` or `no-commits`. The set is open.
|
|
807
818
|
*/
|
|
808
819
|
cause: string
|
|
809
|
-
kind: "flag-age-unavailable"
|
|
810
820
|
} | {
|
|
821
|
+
kind: "ignore-dependencies-glob-unmatched"
|
|
811
822
|
/**
|
|
812
823
|
* The `ignoreDependencies` entry, as written in the config.
|
|
813
824
|
*/
|
|
814
825
|
pattern: string
|
|
815
|
-
kind: "ignore-dependencies-glob-unmatched"
|
|
816
826
|
} | {
|
|
827
|
+
kind: "ignore-findings-pattern-unmatched"
|
|
817
828
|
/**
|
|
818
829
|
* The `ignoreFindings` entry, as written in the config.
|
|
819
830
|
*/
|
|
820
831
|
pattern: string
|
|
821
|
-
kind: "ignore-findings-pattern-unmatched"
|
|
822
832
|
} | {
|
|
833
|
+
kind: "entry-pattern-redundant"
|
|
834
|
+
/**
|
|
835
|
+
* The `entry` pattern, as written in the config.
|
|
836
|
+
*/
|
|
837
|
+
pattern: string
|
|
838
|
+
} | {
|
|
839
|
+
kind: "ignore-dependencies-entry-redundant"
|
|
840
|
+
/**
|
|
841
|
+
* The `ignoreDependencies` entry, as written in the config.
|
|
842
|
+
*/
|
|
843
|
+
pattern: string
|
|
844
|
+
} | {
|
|
845
|
+
kind: "ignore-patterns-entry-redundant"
|
|
846
|
+
/**
|
|
847
|
+
* The `ignorePatterns` glob, as written in the config.
|
|
848
|
+
*/
|
|
849
|
+
pattern: string
|
|
850
|
+
} | {
|
|
851
|
+
kind: "baseline-install-state-mismatch"
|
|
823
852
|
baseline_node_modules: NodeModulesState
|
|
824
853
|
run_node_modules: NodeModulesState
|
|
825
|
-
kind: "baseline-install-state-mismatch"
|
|
826
854
|
})
|
|
827
855
|
/**
|
|
828
856
|
* Why the declared pnpm version ignores the `overrides` section of
|
|
@@ -922,6 +950,15 @@ export type WorsenedMetricKind = ("cyclomatic" | "cognitive" | "crap" | "line_co
|
|
|
922
950
|
* Audit-mode reason why a complexity finding does not gate the verdict.
|
|
923
951
|
*/
|
|
924
952
|
export type AuditGateExemption = "test-file"
|
|
953
|
+
/**
|
|
954
|
+
* How `fallow health` counts cyclomatic complexity for its gates.
|
|
955
|
+
*
|
|
956
|
+
* The policy changes the cyclomatic value that the `maxCyclomatic` gate reads
|
|
957
|
+
* and the cyclomatic value in every CRAP score. It does not change the health
|
|
958
|
+
* score, the complexity density, or the hotspot ranking: those keep the
|
|
959
|
+
* standard count so that grades stay comparable across projects.
|
|
960
|
+
*/
|
|
961
|
+
export type CyclomaticPolicy = ("standard" | "literal-membership")
|
|
925
962
|
/**
|
|
926
963
|
* Coverage model used for CRAP score computation.
|
|
927
964
|
*/
|
|
@@ -1189,12 +1226,13 @@ export type DiffRiskActionType = ("suppress-line" | "suppress-file" | "suppress-
|
|
|
1189
1226
|
* `target` block of [`InspectOutput`], tagged by `type`.
|
|
1190
1227
|
*/
|
|
1191
1228
|
export type InspectTargetDescriptor = ({
|
|
1229
|
+
type: "file"
|
|
1192
1230
|
/**
|
|
1193
1231
|
* File path relative to the analysed root.
|
|
1194
1232
|
*/
|
|
1195
1233
|
file: string
|
|
1196
|
-
type: "file"
|
|
1197
1234
|
} | {
|
|
1235
|
+
type: "symbol"
|
|
1198
1236
|
/**
|
|
1199
1237
|
* File path relative to the analysed root.
|
|
1200
1238
|
*/
|
|
@@ -1203,7 +1241,6 @@ file: string
|
|
|
1203
1241
|
* Name of the inspected export.
|
|
1204
1242
|
*/
|
|
1205
1243
|
export_name: string
|
|
1206
|
-
type: "symbol"
|
|
1207
1244
|
})
|
|
1208
1245
|
/**
|
|
1209
1246
|
* `identity` block of [`InspectOutput`]; shape follows the target type.
|
|
@@ -2031,7 +2068,8 @@ files?: GateFile[]
|
|
|
2031
2068
|
*
|
|
2032
2069
|
* Today only `parse-error` emits it. The item carries the same facts as the
|
|
2033
2070
|
* `source-parse-degraded` entry in `workspace_diagnostics[]` for that file,
|
|
2034
|
-
* so a consumer can act on the gate without a join.
|
|
2071
|
+
* so a consumer can act on the gate without a join. With `reason` set, the
|
|
2072
|
+
* count and the parser outcome are placeholders.
|
|
2035
2073
|
*/
|
|
2036
2074
|
export interface GateFile {
|
|
2037
2075
|
/**
|
|
@@ -2039,14 +2077,19 @@ export interface GateFile {
|
|
|
2039
2077
|
*/
|
|
2040
2078
|
path: string
|
|
2041
2079
|
/**
|
|
2042
|
-
* The number of parser errors for the file.
|
|
2080
|
+
* The number of parser errors for the file. `1` when `reason` is set.
|
|
2043
2081
|
*/
|
|
2044
2082
|
error_count: number
|
|
2045
2083
|
/**
|
|
2046
2084
|
* True when the parser stopped in the file instead of recovering, so the
|
|
2047
|
-
* analysis saw only the part before the error.
|
|
2085
|
+
* analysis saw only the part before the error. `true` when `reason` is set.
|
|
2048
2086
|
*/
|
|
2049
2087
|
panicked: boolean
|
|
2088
|
+
/**
|
|
2089
|
+
* Why the file counts when it is not a parser error. Absent for a parser
|
|
2090
|
+
* error, the only reason before this field existed.
|
|
2091
|
+
*/
|
|
2092
|
+
reason?: (GateFileReason | null)
|
|
2050
2093
|
}
|
|
2051
2094
|
/**
|
|
2052
2095
|
* Metric and rule definitions emitted under `_meta` when `--explain` is
|
|
@@ -3431,7 +3474,7 @@ _meta?: (Meta | null)
|
|
|
3431
3474
|
* - source discovery, during the file walk: `skipped-large-file`,
|
|
3432
3475
|
* `skipped-minified-file`, `skipped-source-dotdir`,
|
|
3433
3476
|
* `excluded-by-default-ignore`, `source-read-failure`,
|
|
3434
|
-
* `source-parse-degraded`;
|
|
3477
|
+
* `source-parse-degraded`, `source-nesting-too-deep`;
|
|
3435
3478
|
* - dead-code analysis, from the dependency-catalog and override
|
|
3436
3479
|
* detectors: `malformed-pnpm-workspace-yaml`,
|
|
3437
3480
|
* `bun-lockb-override-resolution-skipped`;
|
|
@@ -3450,10 +3493,11 @@ _meta?: (Meta | null)
|
|
|
3450
3493
|
*
|
|
3451
3494
|
* A diagnostic here is advisory and never withholds a finding. Where an
|
|
3452
3495
|
* entry reports a source file this run never fully analyzed
|
|
3453
|
-
* (`source-parse-degraded`, `source-
|
|
3454
|
-
* `skipped-
|
|
3455
|
-
* verdict, so the affected
|
|
3456
|
-
*
|
|
3496
|
+
* (`source-parse-degraded`, `source-nesting-too-deep`,
|
|
3497
|
+
* `source-read-failure`, `skipped-large-file`, `skipped-minified-file`,
|
|
3498
|
+
* `skipped-source-dotdir`) it can distort a verdict, so the affected
|
|
3499
|
+
* `unused_files[]`, `unused_exports[]`, and dependency entries
|
|
3500
|
+
* additionally carry the caveat themselves in their own
|
|
3457
3501
|
* optional `reachability_caveats[]` array, and a reader who never scrolls
|
|
3458
3502
|
* back up to this list still sees it. `fallow fix` reads the same array
|
|
3459
3503
|
* and withholds the removal while a caveat stands.
|
|
@@ -3513,6 +3557,14 @@ total_issues: number
|
|
|
3513
3557
|
* Prop chains whose saved effective severity explicitly enforces error policy.
|
|
3514
3558
|
*/
|
|
3515
3559
|
prop_drilling_chains?: number
|
|
3560
|
+
/**
|
|
3561
|
+
* Thin wrappers whose saved effective severity explicitly enforces error policy.
|
|
3562
|
+
*/
|
|
3563
|
+
thin_wrappers?: number
|
|
3564
|
+
/**
|
|
3565
|
+
* Duplicate prop shapes whose saved effective severity explicitly enforces error policy.
|
|
3566
|
+
*/
|
|
3567
|
+
duplicate_prop_shapes?: number
|
|
3516
3568
|
/**
|
|
3517
3569
|
* Unused source files.
|
|
3518
3570
|
*/
|
|
@@ -6904,11 +6956,11 @@ actions: IssueAction[]
|
|
|
6904
6956
|
*/
|
|
6905
6957
|
introduced?: (AuditIntroduced | null)
|
|
6906
6958
|
/**
|
|
6907
|
-
* Rule severity of this finding.
|
|
6908
|
-
*
|
|
6909
|
-
*
|
|
6910
|
-
*
|
|
6911
|
-
*
|
|
6959
|
+
* Rule severity of this finding. Explicit errors enforce analysis gates;
|
|
6960
|
+
* warnings stay advisory, including under strict flags. Saved reports
|
|
6961
|
+
* retain this value for CI levels without the original config. Absent
|
|
6962
|
+
* in output from older versions. Not part of finding identity, baseline
|
|
6963
|
+
* keys or fingerprints.
|
|
6912
6964
|
*/
|
|
6913
6965
|
effective_severity?: (EffectiveSeverity | null)
|
|
6914
6966
|
}
|
|
@@ -6970,11 +7022,11 @@ actions: IssueAction[]
|
|
|
6970
7022
|
*/
|
|
6971
7023
|
introduced?: (AuditIntroduced | null)
|
|
6972
7024
|
/**
|
|
6973
|
-
* Rule severity of this finding.
|
|
6974
|
-
*
|
|
6975
|
-
*
|
|
6976
|
-
*
|
|
6977
|
-
*
|
|
7025
|
+
* Rule severity of this finding. Explicit errors enforce analysis gates;
|
|
7026
|
+
* warnings stay advisory, including under strict flags. Saved reports
|
|
7027
|
+
* retain this value for CI levels without the original config. Absent
|
|
7028
|
+
* in output from older versions. Not part of finding identity, baseline
|
|
7029
|
+
* keys or fingerprints.
|
|
6978
7030
|
*/
|
|
6979
7031
|
effective_severity?: (EffectiveSeverity | null)
|
|
6980
7032
|
}
|
|
@@ -7987,9 +8039,17 @@ line: number
|
|
|
7987
8039
|
*/
|
|
7988
8040
|
col: number
|
|
7989
8041
|
/**
|
|
7990
|
-
* Cyclomatic complexity of the function
|
|
8042
|
+
* Cyclomatic complexity of the function, as the cyclomatic gate and the
|
|
8043
|
+
* CRAP score read it. Under the `literal-membership` value of
|
|
8044
|
+
* `health.cyclomaticPolicy`, this is the value after literal membership
|
|
8045
|
+
* chains count as one predicate.
|
|
7991
8046
|
*/
|
|
7992
8047
|
cyclomatic: number
|
|
8048
|
+
/**
|
|
8049
|
+
* Standard `McCabe` cyclomatic complexity, present only when the
|
|
8050
|
+
* `health.cyclomaticPolicy` value gave `cyclomatic` a different value.
|
|
8051
|
+
*/
|
|
8052
|
+
standard_cyclomatic?: (number | null)
|
|
7993
8053
|
/**
|
|
7994
8054
|
* Cognitive complexity of the function.
|
|
7995
8055
|
*/
|
|
@@ -8305,6 +8365,15 @@ weight: number
|
|
|
8305
8365
|
* consumer explain a cognitive `+3` as "+1 base, +2 nesting".
|
|
8306
8366
|
*/
|
|
8307
8367
|
nesting: number
|
|
8368
|
+
/**
|
|
8369
|
+
* This cyclomatic `||` increment is part of a literal membership chain:
|
|
8370
|
+
* strict equality checks of one identifier against primitive literals
|
|
8371
|
+
* (`kind === "a" || kind === "b"`). The `literal-membership` value of
|
|
8372
|
+
* `health.cyclomaticPolicy` removes these increments from the effective
|
|
8373
|
+
* cyclomatic value. Omitted when `false`, and always `false` under the
|
|
8374
|
+
* default `standard` policy.
|
|
8375
|
+
*/
|
|
8376
|
+
literal_membership?: boolean
|
|
8308
8377
|
}
|
|
8309
8378
|
/**
|
|
8310
8379
|
* Resolved thresholds used to evaluate a health finding.
|
|
@@ -8435,6 +8504,11 @@ functions_above_threshold: number
|
|
|
8435
8504
|
* Global cyclomatic-complexity ceiling for this run.
|
|
8436
8505
|
*/
|
|
8437
8506
|
max_cyclomatic_threshold: number
|
|
8507
|
+
/**
|
|
8508
|
+
* Cyclomatic policy of the gates (`health.cyclomaticPolicy`). Absent
|
|
8509
|
+
* under the default `standard` policy.
|
|
8510
|
+
*/
|
|
8511
|
+
cyclomatic_policy?: (CyclomaticPolicy | null)
|
|
8438
8512
|
/**
|
|
8439
8513
|
* Global cognitive-complexity ceiling for this run.
|
|
8440
8514
|
*/
|
|
@@ -16769,7 +16843,7 @@ _meta?: (Meta | null)
|
|
|
16769
16843
|
* - source discovery, during the file walk: `skipped-large-file`,
|
|
16770
16844
|
* `skipped-minified-file`, `skipped-source-dotdir`,
|
|
16771
16845
|
* `excluded-by-default-ignore`, `source-read-failure`,
|
|
16772
|
-
* `source-parse-degraded`;
|
|
16846
|
+
* `source-parse-degraded`, `source-nesting-too-deep`;
|
|
16773
16847
|
* - dead-code analysis, from the dependency-catalog and override
|
|
16774
16848
|
* detectors: `malformed-pnpm-workspace-yaml`,
|
|
16775
16849
|
* `bun-lockb-override-resolution-skipped`;
|
|
@@ -16788,10 +16862,11 @@ _meta?: (Meta | null)
|
|
|
16788
16862
|
*
|
|
16789
16863
|
* A diagnostic here is advisory and never withholds a finding. Where an
|
|
16790
16864
|
* entry reports a source file this run never fully analyzed
|
|
16791
|
-
* (`source-parse-degraded`, `source-
|
|
16792
|
-
* `skipped-
|
|
16793
|
-
* verdict, so the affected
|
|
16794
|
-
*
|
|
16865
|
+
* (`source-parse-degraded`, `source-nesting-too-deep`,
|
|
16866
|
+
* `source-read-failure`, `skipped-large-file`, `skipped-minified-file`,
|
|
16867
|
+
* `skipped-source-dotdir`) it can distort a verdict, so the affected
|
|
16868
|
+
* `unused_files[]`, `unused_exports[]`, and dependency entries
|
|
16869
|
+
* additionally carry the caveat themselves in their own
|
|
16795
16870
|
* optional `reachability_caveats[]` array, and a reader who never scrolls
|
|
16796
16871
|
* back up to this list still sees it. `fallow fix` reads the same array
|
|
16797
16872
|
* and withholds the removal while a caveat stands.
|
|
@@ -16829,10 +16904,12 @@ elapsed_ms: ElapsedMs
|
|
|
16829
16904
|
/**
|
|
16830
16905
|
* The verdict of every gate this run evaluated, keyed by name. The CLI
|
|
16831
16906
|
* always emits it, with the default exit rule of each section that ran
|
|
16832
|
-
* (`error-severity-findings`, `health-findings`).
|
|
16907
|
+
* (`error-severity-findings`, `health-findings`). A `coverage-gaps` rule
|
|
16908
|
+
* at `error` adds `health-coverage-gaps`. Without
|
|
16833
16909
|
* `--fail-on-issues` or `--ci`, the machine formats of the combined run
|
|
16834
16910
|
* exit 0 for findings, so most entries have `enforced: false`. With one of
|
|
16835
|
-
* these flags, the findings rules
|
|
16911
|
+
* these flags, the findings rules, `health-coverage-gaps` and
|
|
16912
|
+
* `duplication-threshold` are
|
|
16836
16913
|
* `enforced`, the dupes section adds an enforced `duplication-findings`
|
|
16837
16914
|
* entry, and every format exits 1 when one fails. For the default
|
|
16838
16915
|
* exit rules (`error-severity-findings`,
|
|
@@ -16984,8 +17061,8 @@ total_flags: number
|
|
|
16984
17061
|
* A flags run walks and parses the project like every other analysis, so
|
|
16985
17062
|
* it records the same discovery kinds: a `skipped-large-file`,
|
|
16986
17063
|
* `skipped-minified-file`, or `source-read-failure` file was never
|
|
16987
|
-
* scanned for flags,
|
|
16988
|
-
* a
|
|
17064
|
+
* scanned for flags, a `source-parse-degraded` file was scanned from a
|
|
17065
|
+
* partial module, and a `source-nesting-too-deep` file was not scanned. Each is a reason a flag can be missing from
|
|
16989
17066
|
* `feature_flags[]`, which is exactly what a consumer reading a
|
|
16990
17067
|
* zero-result run needs to know. The analysis-stage kinds appear here
|
|
16991
17068
|
* too: the scan correlates flags with dead exports, so it runs the
|
|
@@ -19845,6 +19922,10 @@ runner?: (MutationRunnerOutput | null)
|
|
|
19845
19922
|
* started.
|
|
19846
19923
|
*/
|
|
19847
19924
|
cache?: (MutationCacheOutput | null)
|
|
19925
|
+
/**
|
|
19926
|
+
* The resume facts. Absent without `--resume`.
|
|
19927
|
+
*/
|
|
19928
|
+
resume?: (MutationResumeOutput | null)
|
|
19848
19929
|
summary: MutationSummary
|
|
19849
19930
|
/**
|
|
19850
19931
|
* Each mutant, ranked mutants first.
|
|
@@ -19979,6 +20060,36 @@ stored: number
|
|
|
19979
20060
|
*/
|
|
19980
20061
|
not_keyed: string[]
|
|
19981
20062
|
}
|
|
20063
|
+
/**
|
|
20064
|
+
* The resume facts of a `--resume` run.
|
|
20065
|
+
*/
|
|
20066
|
+
export interface MutationResumeOutput {
|
|
20067
|
+
/**
|
|
20068
|
+
* The path of the outcome journal, relative to the project root. When
|
|
20069
|
+
* the cache directory is outside the root, the path is absolute: the
|
|
20070
|
+
* report has no other cache path, so no other rule applies. The file
|
|
20071
|
+
* stays only when the run did not complete. A run with
|
|
20072
|
+
* `completion.status: complete` removes it.
|
|
20073
|
+
*/
|
|
20074
|
+
journal: string
|
|
20075
|
+
/**
|
|
20076
|
+
* The mutants whose status came from the journal. They did not run.
|
|
20077
|
+
*/
|
|
20078
|
+
reused: number
|
|
20079
|
+
/**
|
|
20080
|
+
* The journal results whose key does not match this run, because an
|
|
20081
|
+
* input of the mutant changed. These results were not reused from the
|
|
20082
|
+
* journal. The mutant ran again, or its status came from the result
|
|
20083
|
+
* cache.
|
|
20084
|
+
*/
|
|
20085
|
+
rejected: number
|
|
20086
|
+
/**
|
|
20087
|
+
* Why the run did not read a journal and started from the beginning,
|
|
20088
|
+
* for example because no journal exists. Absent when the run read the
|
|
20089
|
+
* journal.
|
|
20090
|
+
*/
|
|
20091
|
+
note?: (string | null)
|
|
20092
|
+
}
|
|
19982
20093
|
/**
|
|
19983
20094
|
* The totals of a run.
|
|
19984
20095
|
*/
|
|
@@ -20104,6 +20215,11 @@ attempts?: MutantAttempt[]
|
|
|
20104
20215
|
* The mutant did not run in this run. `--no-cache` runs each mutant.
|
|
20105
20216
|
*/
|
|
20106
20217
|
cached?: boolean
|
|
20218
|
+
/**
|
|
20219
|
+
* True when the status comes from the journal of an interrupted run
|
|
20220
|
+
* (`--resume`). The mutant did not run in this run.
|
|
20221
|
+
*/
|
|
20222
|
+
resumed?: boolean
|
|
20107
20223
|
/**
|
|
20108
20224
|
* The TypeScript diagnostic codes of the new errors of a
|
|
20109
20225
|
* `compile_error` mutant, sorted, at most 8.
|
|
@@ -20286,7 +20402,8 @@ changed_paths: string[]
|
|
|
20286
20402
|
*/
|
|
20287
20403
|
export interface MutationRunIssue {
|
|
20288
20404
|
/**
|
|
20289
|
-
* A stable kebab-case code: `
|
|
20405
|
+
* A stable kebab-case code: `cache-write-failed`,
|
|
20406
|
+
* `journal-write-failed`, `runtime-error`, `static-map-miss`,
|
|
20290
20407
|
* `test-files-not-discovered`, `typecheck-failed`, `worktree-changed`
|
|
20291
20408
|
* or `worktree-check-failed`.
|
|
20292
20409
|
*/
|