fallow 3.21.0 → 3.23.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/capabilities.json +82 -40
- package/package.json +10 -10
- package/schema.json +11 -4
- package/skills/fallow/SKILL.md +2 -1
- package/skills/fallow/references/cli-reference.md +10 -10
- package/skills/fallow/references/mcp.md +1 -1
- package/types/output-contract.d.ts +324 -3
package/capabilities.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.23.0",
|
|
4
4
|
"manifest_version": "1",
|
|
5
5
|
"description": "Codebase analyzer for TypeScript/JavaScript: unused code, circular dependencies, code duplication, complexity hotspots, and architecture boundary violations",
|
|
6
6
|
"global_flags": [
|
|
@@ -906,6 +906,11 @@
|
|
|
906
906
|
"description": "Inspect the optional TypeScript semantic companion",
|
|
907
907
|
"flags": []
|
|
908
908
|
},
|
|
909
|
+
{
|
|
910
|
+
"name": "doctor",
|
|
911
|
+
"description": "Diagnose project readiness without analysis or mutation",
|
|
912
|
+
"flags": []
|
|
913
|
+
},
|
|
909
914
|
{
|
|
910
915
|
"name": "similar-code",
|
|
911
916
|
"description": "Find semantically similar functions with a pinned local model (opt-in)",
|
|
@@ -6004,10 +6009,11 @@
|
|
|
6004
6009
|
"FALLOW_CACHE_DIR": "Directory for fallow's persistent analysis cache. Relative paths resolve from the project root and override cache.dir.",
|
|
6005
6010
|
"FALLOW_CACHE_MAX_SIZE": "Extraction cache size cap in megabytes (default 256). Wins over the cache.maxSizeMb config field.",
|
|
6006
6011
|
"FALLOW_EXTENDS_TIMEOUT_SECS": "Timeout in seconds for fetching https:// configs referenced via the extends field (default 5).",
|
|
6007
|
-
"FALLOW_COVERAGE": "Path to Istanbul coverage data (coverage-final.json) for accurate per-function CRAP scores. CLI --coverage flag overrides this; it wins over the health.coverage config field. Honored by the health, bare fallow, and
|
|
6008
|
-
"FALLOW_COVERAGE_ROOT": "Absolute coverage-data path prefix for rebasing Istanbul paths in CI or containers. CLI --coverage-root flag overrides this; it wins over the health.coverageRoot config field. Honored by the health, bare fallow, and
|
|
6012
|
+
"FALLOW_COVERAGE": "Path to Istanbul coverage data (coverage-final.json) for accurate per-function CRAP scores. CLI --coverage flag overrides this; it wins over the health.coverage config field. Honored by the health, bare fallow, audit, and viz CLI commands and by the MCP audit and check_health tools on both their typed route and their CLI fallback, where the explicit coverage parameter overrides it. Viz reads it through the same precedence and has no coverage flag of its own.",
|
|
6013
|
+
"FALLOW_COVERAGE_ROOT": "Absolute coverage-data path prefix for rebasing Istanbul paths in CI or containers. CLI --coverage-root flag overrides this; it wins over the health.coverageRoot config field. Honored by the health, bare fallow, audit, and viz CLI commands and by the MCP audit and check_health tools on both their typed route and their CLI fallback, where the explicit coverage_root parameter overrides it. Viz reads it through the same precedence and has no coverage flag of its own.",
|
|
6009
6014
|
"FALLOW_MAX_FILE_SIZE": "Per-file size ceiling in megabytes for source discovery (default 5; 0 = no limit). CLI --max-file-size flag overrides this.",
|
|
6010
6015
|
"FALLOW_TYPE_AWARE": "Enable or disable TypeScript semantic (type-aware) analysis for the run (true/false/1/0/yes/no/on/off). Precedence: --type-aware/--no-type-aware CLI flags, then FALLOW_TYPE_AWARE, then the audit.typeAware config field, then typeAware.enabled.",
|
|
6016
|
+
"FALLOW_TYPE_AWARE_TIMEOUT_SECS": "Wall clock in seconds allowed for one TypeScript semantic sidecar request (default 120; unset, 0, or a non-numeric value keeps the default). Raise it for very large TypeScript programs, where a semantic query scans the whole program.",
|
|
6011
6017
|
"FALLOW_TYPE_AWARE_BIN": "Trusted executable override for the TypeScript semantic refinement sidecar used by dead-code --type-aware. Relative paths resolve from the caller's working directory before --root is applied; project node_modules and PATH are intentionally not searched. Default: sibling of the active Fallow executable.",
|
|
6012
6018
|
"FALLOW_AUDIT_BASE": "Pins the fallow audit comparison base ref when no --base/--changed-since is passed (e.g. upstream/main).",
|
|
6013
6019
|
"FALLOW_AUDIT_CACHE_MAX_AGE_DAYS": "GC threshold in days for reusable audit base-snapshot caches (default 30; 0 disables the sweep).",
|
|
@@ -6524,7 +6530,8 @@
|
|
|
6524
6530
|
],
|
|
6525
6531
|
"license": "free",
|
|
6526
6532
|
"license_note": null,
|
|
6527
|
-
"read_only": true
|
|
6533
|
+
"read_only": true,
|
|
6534
|
+
"code_mode_alias": null
|
|
6528
6535
|
},
|
|
6529
6536
|
{
|
|
6530
6537
|
"name": "analyze",
|
|
@@ -6541,7 +6548,8 @@
|
|
|
6541
6548
|
],
|
|
6542
6549
|
"license": "free",
|
|
6543
6550
|
"license_note": null,
|
|
6544
|
-
"read_only": true
|
|
6551
|
+
"read_only": true,
|
|
6552
|
+
"code_mode_alias": "analyze"
|
|
6545
6553
|
},
|
|
6546
6554
|
{
|
|
6547
6555
|
"name": "check_changed",
|
|
@@ -6555,7 +6563,8 @@
|
|
|
6555
6563
|
],
|
|
6556
6564
|
"license": "free",
|
|
6557
6565
|
"license_note": null,
|
|
6558
|
-
"read_only": true
|
|
6566
|
+
"read_only": true,
|
|
6567
|
+
"code_mode_alias": "checkChanged"
|
|
6559
6568
|
},
|
|
6560
6569
|
{
|
|
6561
6570
|
"name": "security_candidates",
|
|
@@ -6570,7 +6579,8 @@
|
|
|
6570
6579
|
],
|
|
6571
6580
|
"license": "free",
|
|
6572
6581
|
"license_note": null,
|
|
6573
|
-
"read_only": true
|
|
6582
|
+
"read_only": true,
|
|
6583
|
+
"code_mode_alias": "securityCandidates"
|
|
6574
6584
|
},
|
|
6575
6585
|
{
|
|
6576
6586
|
"name": "find_similar_code",
|
|
@@ -6586,7 +6596,8 @@
|
|
|
6586
6596
|
],
|
|
6587
6597
|
"license": "free",
|
|
6588
6598
|
"license_note": null,
|
|
6589
|
-
"read_only": true
|
|
6599
|
+
"read_only": true,
|
|
6600
|
+
"code_mode_alias": null
|
|
6590
6601
|
},
|
|
6591
6602
|
{
|
|
6592
6603
|
"name": "inspect_similar_code",
|
|
@@ -6599,7 +6610,8 @@
|
|
|
6599
6610
|
],
|
|
6600
6611
|
"license": "free",
|
|
6601
6612
|
"license_note": null,
|
|
6602
|
-
"read_only": true
|
|
6613
|
+
"read_only": true,
|
|
6614
|
+
"code_mode_alias": null
|
|
6603
6615
|
},
|
|
6604
6616
|
{
|
|
6605
6617
|
"name": "inspect_target",
|
|
@@ -6613,7 +6625,8 @@
|
|
|
6613
6625
|
],
|
|
6614
6626
|
"license": "free",
|
|
6615
6627
|
"license_note": null,
|
|
6616
|
-
"read_only": true
|
|
6628
|
+
"read_only": true,
|
|
6629
|
+
"code_mode_alias": null
|
|
6617
6630
|
},
|
|
6618
6631
|
{
|
|
6619
6632
|
"name": "guard",
|
|
@@ -6625,7 +6638,8 @@
|
|
|
6625
6638
|
],
|
|
6626
6639
|
"license": "free",
|
|
6627
6640
|
"license_note": null,
|
|
6628
|
-
"read_only": true
|
|
6641
|
+
"read_only": true,
|
|
6642
|
+
"code_mode_alias": null
|
|
6629
6643
|
},
|
|
6630
6644
|
{
|
|
6631
6645
|
"name": "find_dupes",
|
|
@@ -6642,7 +6656,8 @@
|
|
|
6642
6656
|
],
|
|
6643
6657
|
"license": "free",
|
|
6644
6658
|
"license_note": null,
|
|
6645
|
-
"read_only": true
|
|
6659
|
+
"read_only": true,
|
|
6660
|
+
"code_mode_alias": "findDupes"
|
|
6646
6661
|
},
|
|
6647
6662
|
{
|
|
6648
6663
|
"name": "check_health",
|
|
@@ -6662,7 +6677,8 @@
|
|
|
6662
6677
|
],
|
|
6663
6678
|
"license": "free",
|
|
6664
6679
|
"license_note": null,
|
|
6665
|
-
"read_only": true
|
|
6680
|
+
"read_only": true,
|
|
6681
|
+
"code_mode_alias": "checkHealth"
|
|
6666
6682
|
},
|
|
6667
6683
|
{
|
|
6668
6684
|
"name": "check_runtime_coverage",
|
|
@@ -6678,7 +6694,8 @@
|
|
|
6678
6694
|
],
|
|
6679
6695
|
"license": "freemium",
|
|
6680
6696
|
"license_note": "A single local runtime-coverage capture is free; continuous or multi-capture runtime monitoring requires an active license (fallow license activate).",
|
|
6681
|
-
"read_only": true
|
|
6697
|
+
"read_only": true,
|
|
6698
|
+
"code_mode_alias": "checkRuntimeCoverage"
|
|
6682
6699
|
},
|
|
6683
6700
|
{
|
|
6684
6701
|
"name": "get_hot_paths",
|
|
@@ -6692,7 +6709,8 @@
|
|
|
6692
6709
|
],
|
|
6693
6710
|
"license": "freemium",
|
|
6694
6711
|
"license_note": "A single local runtime-coverage capture is free; continuous or multi-capture runtime monitoring requires an active license (fallow license activate).",
|
|
6695
|
-
"read_only": true
|
|
6712
|
+
"read_only": true,
|
|
6713
|
+
"code_mode_alias": "getHotPaths"
|
|
6696
6714
|
},
|
|
6697
6715
|
{
|
|
6698
6716
|
"name": "get_blast_radius",
|
|
@@ -6705,7 +6723,8 @@
|
|
|
6705
6723
|
],
|
|
6706
6724
|
"license": "freemium",
|
|
6707
6725
|
"license_note": "A single local runtime-coverage capture is free; continuous or multi-capture runtime monitoring requires an active license (fallow license activate).",
|
|
6708
|
-
"read_only": true
|
|
6726
|
+
"read_only": true,
|
|
6727
|
+
"code_mode_alias": "getBlastRadius"
|
|
6709
6728
|
},
|
|
6710
6729
|
{
|
|
6711
6730
|
"name": "get_importance",
|
|
@@ -6718,7 +6737,8 @@
|
|
|
6718
6737
|
],
|
|
6719
6738
|
"license": "freemium",
|
|
6720
6739
|
"license_note": "A single local runtime-coverage capture is free; continuous or multi-capture runtime monitoring requires an active license (fallow license activate).",
|
|
6721
|
-
"read_only": true
|
|
6740
|
+
"read_only": true,
|
|
6741
|
+
"code_mode_alias": "getImportance"
|
|
6722
6742
|
},
|
|
6723
6743
|
{
|
|
6724
6744
|
"name": "get_cleanup_candidates",
|
|
@@ -6731,7 +6751,8 @@
|
|
|
6731
6751
|
],
|
|
6732
6752
|
"license": "freemium",
|
|
6733
6753
|
"license_note": "A single local runtime-coverage capture is free; continuous or multi-capture runtime monitoring requires an active license (fallow license activate).",
|
|
6734
|
-
"read_only": true
|
|
6754
|
+
"read_only": true,
|
|
6755
|
+
"code_mode_alias": "getCleanupCandidates"
|
|
6735
6756
|
},
|
|
6736
6757
|
{
|
|
6737
6758
|
"name": "get_token_blast_radius",
|
|
@@ -6741,7 +6762,8 @@
|
|
|
6741
6762
|
"key_params": [],
|
|
6742
6763
|
"license": "free",
|
|
6743
6764
|
"license_note": null,
|
|
6744
|
-
"read_only": true
|
|
6765
|
+
"read_only": true,
|
|
6766
|
+
"code_mode_alias": null
|
|
6745
6767
|
},
|
|
6746
6768
|
{
|
|
6747
6769
|
"name": "audit",
|
|
@@ -6758,7 +6780,8 @@
|
|
|
6758
6780
|
],
|
|
6759
6781
|
"license": "free",
|
|
6760
6782
|
"license_note": null,
|
|
6761
|
-
"read_only": true
|
|
6783
|
+
"read_only": true,
|
|
6784
|
+
"code_mode_alias": "audit"
|
|
6762
6785
|
},
|
|
6763
6786
|
{
|
|
6764
6787
|
"name": "decision_surface",
|
|
@@ -6772,7 +6795,8 @@
|
|
|
6772
6795
|
],
|
|
6773
6796
|
"license": "free",
|
|
6774
6797
|
"license_note": null,
|
|
6775
|
-
"read_only": true
|
|
6798
|
+
"read_only": true,
|
|
6799
|
+
"code_mode_alias": null
|
|
6776
6800
|
},
|
|
6777
6801
|
{
|
|
6778
6802
|
"name": "fallow_explain",
|
|
@@ -6784,7 +6808,8 @@
|
|
|
6784
6808
|
],
|
|
6785
6809
|
"license": "free",
|
|
6786
6810
|
"license_note": null,
|
|
6787
|
-
"read_only": true
|
|
6811
|
+
"read_only": true,
|
|
6812
|
+
"code_mode_alias": "explain"
|
|
6788
6813
|
},
|
|
6789
6814
|
{
|
|
6790
6815
|
"name": "fix_preview",
|
|
@@ -6796,7 +6821,8 @@
|
|
|
6796
6821
|
],
|
|
6797
6822
|
"license": "free",
|
|
6798
6823
|
"license_note": null,
|
|
6799
|
-
"read_only": true
|
|
6824
|
+
"read_only": true,
|
|
6825
|
+
"code_mode_alias": null
|
|
6800
6826
|
},
|
|
6801
6827
|
{
|
|
6802
6828
|
"name": "fix_apply",
|
|
@@ -6808,7 +6834,8 @@
|
|
|
6808
6834
|
],
|
|
6809
6835
|
"license": "free",
|
|
6810
6836
|
"license_note": null,
|
|
6811
|
-
"read_only": false
|
|
6837
|
+
"read_only": false,
|
|
6838
|
+
"code_mode_alias": null
|
|
6812
6839
|
},
|
|
6813
6840
|
{
|
|
6814
6841
|
"name": "project_info",
|
|
@@ -6823,7 +6850,8 @@
|
|
|
6823
6850
|
],
|
|
6824
6851
|
"license": "free",
|
|
6825
6852
|
"license_note": null,
|
|
6826
|
-
"read_only": true
|
|
6853
|
+
"read_only": true,
|
|
6854
|
+
"code_mode_alias": "projectInfo"
|
|
6827
6855
|
},
|
|
6828
6856
|
{
|
|
6829
6857
|
"name": "recommend",
|
|
@@ -6835,7 +6863,8 @@
|
|
|
6835
6863
|
],
|
|
6836
6864
|
"license": "free",
|
|
6837
6865
|
"license_note": null,
|
|
6838
|
-
"read_only": true
|
|
6866
|
+
"read_only": true,
|
|
6867
|
+
"code_mode_alias": null
|
|
6839
6868
|
},
|
|
6840
6869
|
{
|
|
6841
6870
|
"name": "list_boundaries",
|
|
@@ -6845,7 +6874,8 @@
|
|
|
6845
6874
|
"key_params": [],
|
|
6846
6875
|
"license": "free",
|
|
6847
6876
|
"license_note": null,
|
|
6848
|
-
"read_only": true
|
|
6877
|
+
"read_only": true,
|
|
6878
|
+
"code_mode_alias": "listBoundaries"
|
|
6849
6879
|
},
|
|
6850
6880
|
{
|
|
6851
6881
|
"name": "feature_flags",
|
|
@@ -6858,7 +6888,8 @@
|
|
|
6858
6888
|
],
|
|
6859
6889
|
"license": "free",
|
|
6860
6890
|
"license_note": null,
|
|
6861
|
-
"read_only": true
|
|
6891
|
+
"read_only": true,
|
|
6892
|
+
"code_mode_alias": "featureFlags"
|
|
6862
6893
|
},
|
|
6863
6894
|
{
|
|
6864
6895
|
"name": "list_suppressions",
|
|
@@ -6872,7 +6903,8 @@
|
|
|
6872
6903
|
],
|
|
6873
6904
|
"license": "free",
|
|
6874
6905
|
"license_note": null,
|
|
6875
|
-
"read_only": true
|
|
6906
|
+
"read_only": true,
|
|
6907
|
+
"code_mode_alias": null
|
|
6876
6908
|
},
|
|
6877
6909
|
{
|
|
6878
6910
|
"name": "impact",
|
|
@@ -6884,7 +6916,8 @@
|
|
|
6884
6916
|
],
|
|
6885
6917
|
"license": "free",
|
|
6886
6918
|
"license_note": null,
|
|
6887
|
-
"read_only": true
|
|
6919
|
+
"read_only": true,
|
|
6920
|
+
"code_mode_alias": "impact"
|
|
6888
6921
|
},
|
|
6889
6922
|
{
|
|
6890
6923
|
"name": "impact_all",
|
|
@@ -6897,7 +6930,8 @@
|
|
|
6897
6930
|
],
|
|
6898
6931
|
"license": "free",
|
|
6899
6932
|
"license_note": null,
|
|
6900
|
-
"read_only": true
|
|
6933
|
+
"read_only": true,
|
|
6934
|
+
"code_mode_alias": null
|
|
6901
6935
|
},
|
|
6902
6936
|
{
|
|
6903
6937
|
"name": "trace_export",
|
|
@@ -6910,7 +6944,8 @@
|
|
|
6910
6944
|
],
|
|
6911
6945
|
"license": "free",
|
|
6912
6946
|
"license_note": null,
|
|
6913
|
-
"read_only": true
|
|
6947
|
+
"read_only": true,
|
|
6948
|
+
"code_mode_alias": "traceExport"
|
|
6914
6949
|
},
|
|
6915
6950
|
{
|
|
6916
6951
|
"name": "trace_symbol",
|
|
@@ -6925,7 +6960,8 @@
|
|
|
6925
6960
|
],
|
|
6926
6961
|
"license": "free",
|
|
6927
6962
|
"license_note": null,
|
|
6928
|
-
"read_only": true
|
|
6963
|
+
"read_only": true,
|
|
6964
|
+
"code_mode_alias": null
|
|
6929
6965
|
},
|
|
6930
6966
|
{
|
|
6931
6967
|
"name": "symbol_impact",
|
|
@@ -6942,7 +6978,8 @@
|
|
|
6942
6978
|
],
|
|
6943
6979
|
"license": "free",
|
|
6944
6980
|
"license_note": null,
|
|
6945
|
-
"read_only": true
|
|
6981
|
+
"read_only": true,
|
|
6982
|
+
"code_mode_alias": null
|
|
6946
6983
|
},
|
|
6947
6984
|
{
|
|
6948
6985
|
"name": "trace_file",
|
|
@@ -6954,7 +6991,8 @@
|
|
|
6954
6991
|
],
|
|
6955
6992
|
"license": "free",
|
|
6956
6993
|
"license_note": null,
|
|
6957
|
-
"read_only": true
|
|
6994
|
+
"read_only": true,
|
|
6995
|
+
"code_mode_alias": "traceFile"
|
|
6958
6996
|
},
|
|
6959
6997
|
{
|
|
6960
6998
|
"name": "impact_closure",
|
|
@@ -6966,7 +7004,8 @@
|
|
|
6966
7004
|
],
|
|
6967
7005
|
"license": "free",
|
|
6968
7006
|
"license_note": null,
|
|
6969
|
-
"read_only": true
|
|
7007
|
+
"read_only": true,
|
|
7008
|
+
"code_mode_alias": "impactClosure"
|
|
6970
7009
|
},
|
|
6971
7010
|
{
|
|
6972
7011
|
"name": "trace_dependency",
|
|
@@ -6978,7 +7017,8 @@
|
|
|
6978
7017
|
],
|
|
6979
7018
|
"license": "free",
|
|
6980
7019
|
"license_note": null,
|
|
6981
|
-
"read_only": true
|
|
7020
|
+
"read_only": true,
|
|
7021
|
+
"code_mode_alias": "traceDependency"
|
|
6982
7022
|
},
|
|
6983
7023
|
{
|
|
6984
7024
|
"name": "trace_clone",
|
|
@@ -6994,7 +7034,8 @@
|
|
|
6994
7034
|
],
|
|
6995
7035
|
"license": "free",
|
|
6996
7036
|
"license_note": null,
|
|
6997
|
-
"read_only": true
|
|
7037
|
+
"read_only": true,
|
|
7038
|
+
"code_mode_alias": "traceClone"
|
|
6998
7039
|
}
|
|
6999
7040
|
]
|
|
7000
7041
|
},
|
|
@@ -7069,7 +7110,7 @@
|
|
|
7069
7110
|
]
|
|
7070
7111
|
},
|
|
7071
7112
|
"plugins": {
|
|
7072
|
-
"count":
|
|
7113
|
+
"count": 125,
|
|
7073
7114
|
"note": "Built-in framework plugins, auto-activated when their enabler dependency is present; run fallow list --plugins for the set active in a specific project",
|
|
7074
7115
|
"names": [
|
|
7075
7116
|
"nextjs",
|
|
@@ -7195,7 +7236,8 @@
|
|
|
7195
7236
|
"wuchale",
|
|
7196
7237
|
"varlock",
|
|
7197
7238
|
"pnpm",
|
|
7198
|
-
"bun"
|
|
7239
|
+
"bun",
|
|
7240
|
+
"deno"
|
|
7199
7241
|
]
|
|
7200
7242
|
},
|
|
7201
7243
|
"task_matrix": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fallow",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.23.0",
|
|
4
4
|
"mcpName": "io.github.fallow-rs/fallow",
|
|
5
5
|
"description": "Codebase intelligence for TypeScript and JavaScript. Free static analysis of code and styles, optional paid runtime intelligence (Fallow Runtime). Quality, risk, architecture, dependencies, duplication, and design-system drift for humans, CI, and the agents writing your code. Zero-config framework support.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -88,14 +88,14 @@
|
|
|
88
88
|
"@tanstack/intent": "0.3.6"
|
|
89
89
|
},
|
|
90
90
|
"optionalDependencies": {
|
|
91
|
-
"@fallow-cli/darwin-arm64": "3.
|
|
92
|
-
"@fallow-cli/darwin-x64": "3.
|
|
93
|
-
"@fallow-cli/linux-x64-gnu": "3.
|
|
94
|
-
"@fallow-cli/linux-arm64-gnu": "3.
|
|
95
|
-
"@fallow-cli/linux-x64-musl": "3.
|
|
96
|
-
"@fallow-cli/linux-arm64-musl": "3.
|
|
97
|
-
"@fallow-cli/win32-arm64-msvc": "3.
|
|
98
|
-
"@fallow-cli/win32-x64-msvc": "3.
|
|
99
|
-
"fallow-type-aware": "3.
|
|
91
|
+
"@fallow-cli/darwin-arm64": "3.23.0",
|
|
92
|
+
"@fallow-cli/darwin-x64": "3.23.0",
|
|
93
|
+
"@fallow-cli/linux-x64-gnu": "3.23.0",
|
|
94
|
+
"@fallow-cli/linux-arm64-gnu": "3.23.0",
|
|
95
|
+
"@fallow-cli/linux-x64-musl": "3.23.0",
|
|
96
|
+
"@fallow-cli/linux-arm64-musl": "3.23.0",
|
|
97
|
+
"@fallow-cli/win32-arm64-msvc": "3.23.0",
|
|
98
|
+
"@fallow-cli/win32-x64-msvc": "3.23.0",
|
|
99
|
+
"fallow-type-aware": "3.23.0"
|
|
100
100
|
}
|
|
101
101
|
}
|
package/schema.json
CHANGED
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
],
|
|
13
13
|
"writeOnly": true
|
|
14
14
|
},
|
|
15
|
+
"minimumVersion": {
|
|
16
|
+
"description": "The lowest fallow version this config is written for, as `MAJOR.MINOR.PATCH`. An older binary stops with a message naming both versions instead of failing on the first field it does not recognize, so a config committed to a shared repository says which upgrade it needs rather than reading like a typo. Optional and unset by default; set it in the same change that adds a field introduced in a newer version. It gates nothing on its own: an unknown key still fails on a binary at or above this version, because there the key really is a typo.",
|
|
17
|
+
"type": [
|
|
18
|
+
"string",
|
|
19
|
+
"null"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
15
22
|
"extends": {
|
|
16
23
|
"description": "An ordered array of parent config sources to inherit before this file's own keys apply; each entry is a file-relative path, an `npm:<package>` specifier, or an `https://` URL (`http://` is rejected), deep-merged in order so objects merge field-by-field while arrays and scalars in this file replace the parent's, with cycle and depth guards. Set it to share a base config across a monorepo or team; it is consumed at load and stripped before serialization (serde skip_serializing).",
|
|
17
24
|
"type": "array",
|
|
@@ -898,7 +905,7 @@
|
|
|
898
905
|
"type": "array",
|
|
899
906
|
"items": {
|
|
900
907
|
"type": "string",
|
|
901
|
-
"pattern": "^dup:(?:[0-9a-f]{8}|[0-9a-f]{16}(?:-[1-9][0-9]*)?):(?:[2-9]|[1-9][0-9]+)$"
|
|
908
|
+
"pattern": "^dup:(?:[0-9a-f]{8}|[0-9a-f]{16}(?:-r?[1-9][0-9]*)?):(?:[2-9]|[1-9][0-9]+)$"
|
|
902
909
|
},
|
|
903
910
|
"default": []
|
|
904
911
|
},
|
|
@@ -1067,7 +1074,7 @@
|
|
|
1067
1074
|
"default": 60
|
|
1068
1075
|
},
|
|
1069
1076
|
"coverage": {
|
|
1070
|
-
"description": "Path to Istanbul-format coverage data for accurate per-function CRAP\nscores. Relative paths resolve against the project root. The CLI\n`--coverage` flag and `FALLOW_COVERAGE` environment variable override\nthis value. Consulted by `fallow health`, bare `fallow`, `fallow audit`,\
|
|
1077
|
+
"description": "Path to Istanbul-format coverage data for accurate per-function CRAP\nscores. Relative paths resolve against the project root. The CLI\n`--coverage` flag and `FALLOW_COVERAGE` environment variable override\nthis value. Consulted by `fallow health`, bare `fallow`, `fallow audit`,\n`fallow viz`, and the MCP `audit` / `check_health` tools.",
|
|
1071
1078
|
"type": [
|
|
1072
1079
|
"string",
|
|
1073
1080
|
"null"
|
|
@@ -1075,7 +1082,7 @@
|
|
|
1075
1082
|
"default": null
|
|
1076
1083
|
},
|
|
1077
1084
|
"coverageRoot": {
|
|
1078
|
-
"description": "Absolute prefix to strip from Istanbul file paths before CRAP matching.\nUse when coverage was generated under a different checkout root in CI\nor Docker. The CLI `--coverage-root` flag and `FALLOW_COVERAGE_ROOT`\nenvironment variable override this value. Consulted by `fallow health`,\nbare `fallow`, `fallow audit`, and the MCP `audit`
|
|
1085
|
+
"description": "Absolute prefix to strip from Istanbul file paths before CRAP matching.\nUse when coverage was generated under a different checkout root in CI\nor Docker. The CLI `--coverage-root` flag and `FALLOW_COVERAGE_ROOT`\nenvironment variable override this value. Consulted by `fallow health`,\nbare `fallow`, `fallow audit`, `fallow viz`, and the MCP `audit` /\n`check_health` tools.",
|
|
1079
1086
|
"type": [
|
|
1080
1087
|
"string",
|
|
1081
1088
|
"null"
|
|
@@ -1132,7 +1139,7 @@
|
|
|
1132
1139
|
}
|
|
1133
1140
|
},
|
|
1134
1141
|
"functions": {
|
|
1135
|
-
"description": "Exact emitted function names this override applies to. Empty means every\nfunction in matching files.",
|
|
1142
|
+
"description": "Exact emitted function names this override applies to. Empty means every\nfunction in matching files. Synthetic units are matched by their emitted\nname, so `\"<template>\"` and `\"<snippet:NAME>\"` are valid keys. The\nsynthetic `\"<module>\"` unit is not: it carries a file's module-scope\ndecision points into the aggregate metrics and never produces a finding,\nso there is no ceiling for an override to move.",
|
|
1136
1143
|
"type": "array",
|
|
1137
1144
|
"items": {
|
|
1138
1145
|
"type": "string"
|
package/skills/fallow/SKILL.md
CHANGED
|
@@ -87,6 +87,7 @@ Route by intent before reaching for the big analysis commands. Same matrix as `f
|
|
|
87
87
|
| `dead-code` | Dead code analysis (`check` is an alias) | `--unused-exports`, `--changed-since`, `--changed-workspaces`, `--production`, `--file`, `--include-entry-exports`, `--stale-suppressions`, `--ci`, `--group-by`, `--summary`, `--fail-on-regression`, `--tolerance`, `--regression-baseline`, `--save-regression-baseline` |
|
|
88
88
|
| `watch` | Watch for changes and re-run analysis | `--no-clear` |
|
|
89
89
|
| `type-aware` | Inspect the optional TypeScript semantic companion | |
|
|
90
|
+
| `doctor` | Diagnose project readiness without analysis or mutation | |
|
|
90
91
|
| `similar-code` | Find semantically similar functions with a pinned local model (opt-in) | `--threshold`, `--min-lines`, `--top`, `--file` |
|
|
91
92
|
| `inspect` | Compose one evidence bundle for a file or exported symbol | `--file <path>`, `--symbol <file>:<export>` |
|
|
92
93
|
| `trace` | Trace a symbol's call chain (best-effort, syntactic; OFF the ranked path) | `symbol`, `--callers`, `--callees`, `--depth` |
|
|
@@ -125,7 +126,7 @@ Route by intent before reaching for the big analysis commands. Same matrix as `f
|
|
|
125
126
|
| `coverage` | Runtime coverage setup, focused analysis, and cloud inventory workflow helper | `setup`, `setup --yes`, `setup --non-interactive`, `analyze --runtime-coverage <path>`, `analyze --cloud --repo owner/repo`, `upload-inventory` |
|
|
126
127
|
| `coverage upload-source-maps` | Upload build source maps from CI so bundled runtime coverage resolves to original source paths. Retries 429 `Retry-After` and transient gateway failures. Use `FALLOW_CA_BUNDLE` for complete custom PEM trust bundles. | `--dir dist`, `--git-sha <sha>`, `--repo <name>`, `--strip-path=false`, `--dry-run` |
|
|
127
128
|
| `setup-hooks` | Deprecated (removed in the next major): use `agent install` or `hooks install --target agent`; still installs the Claude Code PreToolUse gate with a stderr warning | `--agent`, `--dry-run`, `--force`, `--user`, `--gitignore-claude`, `--uninstall` |
|
|
128
|
-
| `viz` | Render the codebase as a self-contained interactive HTML map (treemap + import graph
|
|
129
|
+
| `viz` | Render the codebase as a self-contained interactive HTML map (treemap + import graph) with six primary lenses (Overview, Unused, Duplication, Architecture, Health, Security) and Dependencies, Frameworks, Styling, and Feature flags under an adaptive More menu, each with click-through detail panels. Every lens carries an availability state (complete, disabled, not applicable, unavailable) next to its count, so an analysis that did not run reads as missing data instead of as zero findings. Or emit the import graph as text. Read-only. | `--out <path>`, `--no-open`, `--viz-format html\|dot\|mermaid`, `--root`, `--config`, `--production`, `--no-cache` |
|
|
129
130
|
|
|
130
131
|
Run `fallow <command> --help` for the full flag list per command (see also references/cli-reference.md).
|
|
131
132
|
<!-- generated:commands:end -->
|
|
@@ -385,7 +385,7 @@ Human output groups paths under "Shared with your team (commit these)" and "Loca
|
|
|
385
385
|
{
|
|
386
386
|
"kind": "agent-install",
|
|
387
387
|
"schema_version": 1,
|
|
388
|
-
"fallow_version": "3.
|
|
388
|
+
"fallow_version": "3.23.0",
|
|
389
389
|
"root": "/abs/path",
|
|
390
390
|
"mode": "install",
|
|
391
391
|
"dry_run": false,
|
|
@@ -589,7 +589,7 @@ fallow health --format json --quiet --trend
|
|
|
589
589
|
{
|
|
590
590
|
"kind": "health",
|
|
591
591
|
"schema_version": 7,
|
|
592
|
-
"version": "3.
|
|
592
|
+
"version": "3.23.0",
|
|
593
593
|
"elapsed_ms": 32,
|
|
594
594
|
"summary": {
|
|
595
595
|
"files_analyzed": 482,
|
|
@@ -987,7 +987,7 @@ fallow audit \
|
|
|
987
987
|
{
|
|
988
988
|
"kind": "audit",
|
|
989
989
|
"schema_version": 7,
|
|
990
|
-
"version": "3.
|
|
990
|
+
"version": "3.23.0",
|
|
991
991
|
"command": "audit",
|
|
992
992
|
"verdict": "fail",
|
|
993
993
|
"changed_files_count": 12,
|
|
@@ -1064,7 +1064,7 @@ fallow flags --format json --quiet --workspace my-package
|
|
|
1064
1064
|
```json
|
|
1065
1065
|
{
|
|
1066
1066
|
"schema_version": 7,
|
|
1067
|
-
"version": "3.
|
|
1067
|
+
"version": "3.23.0",
|
|
1068
1068
|
"elapsed_ms": 116,
|
|
1069
1069
|
"feature_flags": [],
|
|
1070
1070
|
"total_flags": 0
|
|
@@ -1165,7 +1165,7 @@ fallow security --gate newly-reachable --changed-since origin/main
|
|
|
1165
1165
|
{
|
|
1166
1166
|
"kind": "security",
|
|
1167
1167
|
"schema_version": "4",
|
|
1168
|
-
"version": "3.
|
|
1168
|
+
"version": "3.23.0",
|
|
1169
1169
|
"elapsed_ms": 42,
|
|
1170
1170
|
"config": {
|
|
1171
1171
|
"rules": {
|
|
@@ -1194,7 +1194,7 @@ fallow security --gate newly-reachable --changed-since origin/main
|
|
|
1194
1194
|
{
|
|
1195
1195
|
"kind": "security",
|
|
1196
1196
|
"schema_version": "4",
|
|
1197
|
-
"version": "3.
|
|
1197
|
+
"version": "3.23.0",
|
|
1198
1198
|
"elapsed_ms": 42,
|
|
1199
1199
|
"config": {
|
|
1200
1200
|
"rules": {
|
|
@@ -1959,7 +1959,7 @@ The HTTP layer mirrors the bash `gh_api_retry` / `curl_retry` helpers: `FALLOW_A
|
|
|
1959
1959
|
{
|
|
1960
1960
|
"kind": "dead-code",
|
|
1961
1961
|
"schema_version": 7,
|
|
1962
|
-
"version": "3.
|
|
1962
|
+
"version": "3.23.0",
|
|
1963
1963
|
"elapsed_ms": 45,
|
|
1964
1964
|
"total_issues": 12,
|
|
1965
1965
|
"entry_points": {
|
|
@@ -2119,7 +2119,7 @@ When `--baseline` is used in combined output, the JSON includes a `baseline_delt
|
|
|
2119
2119
|
{
|
|
2120
2120
|
"kind": "dupes",
|
|
2121
2121
|
"schema_version": 7,
|
|
2122
|
-
"version": "3.
|
|
2122
|
+
"version": "3.23.0",
|
|
2123
2123
|
"elapsed_ms": 82,
|
|
2124
2124
|
"total_clones": 15,
|
|
2125
2125
|
"total_lines_duplicated": 230,
|
|
@@ -2163,11 +2163,11 @@ When running `fallow` with no subcommand (all analyses), the JSON output combine
|
|
|
2163
2163
|
{
|
|
2164
2164
|
"kind": "combined",
|
|
2165
2165
|
"schema_version": 7,
|
|
2166
|
-
"version": "3.
|
|
2166
|
+
"version": "3.23.0",
|
|
2167
2167
|
"elapsed_ms": 159,
|
|
2168
2168
|
"check": {
|
|
2169
2169
|
"schema_version": 7,
|
|
2170
|
-
"version": "3.
|
|
2170
|
+
"version": "3.23.0",
|
|
2171
2171
|
"elapsed_ms": 45,
|
|
2172
2172
|
"total_issues": 12,
|
|
2173
2173
|
"unused_files": [],
|
|
@@ -11,7 +11,7 @@ When using fallow via MCP (`fallow-mcp`), the following tools are available:
|
|
|
11
11
|
<!-- generated:mcp-tools:start -->
|
|
12
12
|
| Tool | Kind | License | CLI fallback | Key params | Description |
|
|
13
13
|
|---|---|---|---|---|---|
|
|
14
|
-
| `code_execute` | composition | free | - | `code`, `timeout_ms`, `max_output_bytes` | Bounded read-only Code Mode for composing multiple fallow analysis calls in one JavaScript snippet. The snippet receives `{ fallow, root }`, returns JSON-serializable data, and can call read-only helpers such as `fallow.projectInfo`, `fallow.audit`, `fallow.checkHealth`, and `fallow.run(tool, params)` for the same allowlist. Similar-code is excluded because Code Mode is capped at 30 seconds; use standalone `find_similar_code` and `inspect_similar_code`, which have dedicated 15-minute timeouts. Mutating fix tools are not exposed. The sandbox has no filesystem, network, imports, `
|
|
14
|
+
| `code_execute` | composition | free | - | `code`, `timeout_ms`, `max_output_bytes` | Bounded read-only Code Mode for composing multiple fallow analysis calls in one JavaScript snippet. The snippet receives `{ fallow, root }`, returns JSON-serializable data, and can call read-only helpers such as `fallow.projectInfo`, `fallow.audit`, `fallow.checkHealth`, and `fallow.run(tool, params)` for the same allowlist. `fallow.all(requests)` fans out independent calls in one go: pass `[{ tool, params }, ...]` and get back a positionally aligned array of `{ ok: true, value }` or `{ ok: false, error }`, so one failing element never hides the rest. Host calls are memoized for the duration of one snippet, so repeating the same tool with the same params (key order does not matter) is served from cache, spends no `max_host_calls` slot and no output budget, and is reported in `calls[]` with `cache_hit: true`; a call refused before dispatch (unknown tool, malformed params) spends no slot either, and `limits.max_rejected_host_calls` bounds how many of those the response records. Similar-code is excluded because Code Mode is capped at 30 seconds; use standalone `find_similar_code` and `inspect_similar_code`, which have dedicated 15-minute timeouts. Mutating fix tools are not exposed. The sandbox has no filesystem, network, imports, `process`, `require`, `Deno`, `Bun`, or shell access, and no dynamic code compilation: `eval`, `Function`, and the async and generator function constructors are removed, including the `constructor` route reachable through function prototypes. Params: `code`, optional `root`, `timeout_ms` (capped at 30000), and `max_output_bytes` (capped at 4000000). `max_output_bytes` bounds two separate things: the total fallow JSON host calls read, shared across a `fallow.all` fan-out rather than granted per element, and the serialized snippet result. An oversized result is refused with `ok:false`, `truncated:true`, `result_bytes`, and a short `result_preview` in place of the value, never returned whole, so return a projection rather than a whole report. |
|
|
15
15
|
| `analyze` | analysis | free | `fallow dead-code --format json --quiet` | `issue_types`, `production`, `workspace`, `baseline`, `group_by`, `file` | Full dead code analysis (unused files/exports/types/dependencies/members + circular dependencies + re-export cycles (barrel files that form a structural loop, silently breaking re-exports) + boundary violations + rule-pack policy violations (banned calls, imports, and catalogue-derived effects declared via the `rulePacks` config key) + stale suppressions). Private type leaks are an opt-in API hygiene check via `issue_types: ["private-type-leaks"]`. Set `boundary_violations: true` as a convenience alias for `issue_types: ["boundary-violations"]`. Set `group_by` to `"owner"`, `"directory"`, `"package"`, or `"section"` to partition results. The `section` mode reads GitLab CODEOWNERS `[Section]` headers and emits `owners` metadata per group |
|
|
16
16
|
| `check_changed` | analysis | free | `fallow dead-code --changed-since <ref> --format json --quiet` | `since`, `baseline`, `fail_on_regression` | Incremental analysis of files changed since a git ref |
|
|
17
17
|
| `security_candidates` | analysis | free | `fallow security --format json --quiet` | `gate`, `surface`, `changed_since`, `paths` | Unverified local security candidates, not confirmed vulnerabilities (`fallow security --format json`). Read `security_findings[]` for category, CWE, severity, evidence, trace, optional `reachability`, blind-spot counters, and optional `unresolved_callee_diagnostics` samples for dynamic callee follow-up. `severity` is a review-priority tier, not a verified vulnerability verdict. Each finding also carries an agent-actionable `candidate` (`source_kind`/`sink`/`boundary`), where URL-category sinks may include `url_shape` (`fixed-origin-dynamic-path` or `dynamic-origin`), an optional `taint_flow` source-to-sink triple, and a stable `finding_id` (equal to the SARIF fingerprint) for cross-run correlation; there is no `impact` field (deciding exploitability is the agent's job). Set `surface: true` to include top-level `attack_surface[]` entries with defensive-boundary prompts for a verifier. Set `gate` to `new` for changed-line candidates or `newly-reachable` for candidates that became reachable from entry points; `newly-reachable` requires `changed_since`. `reachability.untrusted_source_trace` is module-level import context only and does not prove value flow; `reachability.taint_confidence` tiers each reachable candidate as `arg-level` (sink argument traces to a same-module source read, strong) or `module-level` (only the module is import-reachable from a source, weak), so tier from this field instead of the evidence text. Verify trace, reachability context, severity, and evidence before editing code. Supports `root`, `config`, `workspace`, `paths`, `changed_since`, `changed_workspaces`, `surface`, `gate`, `no_cache`, and `threads`; `paths` forwards repeated `fallow security --file` filters for finding anchors, trace hops, untrusted-source reachability trace hops, and unresolved-callee diagnostics. See <https://docs.fallow.tools/cli/security-agent-verification> for the verifier packet and verdict recipe. Inherits `FALLOW_DIFF_FILE` from the server environment for line-level diff scoping; raise `FALLOW_TIMEOUT_SECS` for large repos. |
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`, `type-aware-status`, `similar-code`, `similar-code-inspect`, `similar-code-review`. Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field.
|
|
27
|
+
* Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`, `doctor`, `type-aware-status`, `similar-code`, `similar-code-inspect`, `similar-code-review`. Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field.
|
|
28
28
|
*/
|
|
29
29
|
export type FallowJsonOutput = (FallowOutput | CodeClimateOutput | ErrorOutput)
|
|
30
30
|
/**
|
|
@@ -96,6 +96,8 @@ kind: "review-walkthrough-guide"
|
|
|
96
96
|
kind: "review-walkthrough-validation"
|
|
97
97
|
}) | (SuppressionInventoryOutput & {
|
|
98
98
|
kind: "suppression-inventory"
|
|
99
|
+
}) | (DoctorOutput & {
|
|
100
|
+
kind: "doctor"
|
|
99
101
|
}) | (TypeAwareStatusOutput & {
|
|
100
102
|
kind: "type-aware-status"
|
|
101
103
|
}) | (SimilarCodeOutput & {
|
|
@@ -1026,6 +1028,10 @@ export type ConfidenceFlag = ("dynamic-dispatch" | "re-export-indirection")
|
|
|
1026
1028
|
* The category of a single weakening signal.
|
|
1027
1029
|
*/
|
|
1028
1030
|
export type WeakeningKind = ("test-weakened" | "threshold-lowered" | "suppression-added" | "security-check-removed")
|
|
1031
|
+
/**
|
|
1032
|
+
* Where a cognitive-complexity improvement came from.
|
|
1033
|
+
*/
|
|
1034
|
+
export type CognitiveAttribution = ("nesting-reset" | "fewer-branch-points" | "mixed")
|
|
1029
1035
|
/**
|
|
1030
1036
|
* Independently-versioned wire-version newtype. Serializes as the integer
|
|
1031
1037
|
* [`DECISION_SURFACE_SCHEMA_VERSION`].
|
|
@@ -1055,6 +1061,30 @@ export type SuppressionInventoryLevel = ("file" | "line")
|
|
|
1055
1061
|
* How a suppression in the inventory was authored.
|
|
1056
1062
|
*/
|
|
1057
1063
|
export type SuppressionInventoryOrigin = "comment"
|
|
1064
|
+
/**
|
|
1065
|
+
* Schema projection for the exact doctor envelope version.
|
|
1066
|
+
*/
|
|
1067
|
+
export type DoctorSchemaVersion = 1
|
|
1068
|
+
/**
|
|
1069
|
+
* Schema projection for `.` as the privacy-safe diagnosed project root.
|
|
1070
|
+
*/
|
|
1071
|
+
export type DoctorProjectRoot = "."
|
|
1072
|
+
/**
|
|
1073
|
+
* Aggregate readiness outcome.
|
|
1074
|
+
*/
|
|
1075
|
+
export type DoctorStatus = ("pass" | "warn" | "fail")
|
|
1076
|
+
/**
|
|
1077
|
+
* Stable identifier for a doctor check. Declaration order is output order.
|
|
1078
|
+
*/
|
|
1079
|
+
export type DoctorCheckId = ("root" | "config" | "workspaces" | "plugins" | "type-aware")
|
|
1080
|
+
/**
|
|
1081
|
+
* Stable category for a doctor check.
|
|
1082
|
+
*/
|
|
1083
|
+
export type DoctorCheckCategory = ("project" | "configuration" | "workspace" | "plugin" | "companion")
|
|
1084
|
+
/**
|
|
1085
|
+
* Per-check readiness outcome.
|
|
1086
|
+
*/
|
|
1087
|
+
export type DoctorCheckStatus = ("pass" | "warn" | "fail" | "skipped")
|
|
1058
1088
|
/**
|
|
1059
1089
|
* Schema projection for the type-aware status envelope's exact version.
|
|
1060
1090
|
*/
|
|
@@ -5698,7 +5728,13 @@ export interface HealthSummary {
|
|
|
5698
5728
|
*/
|
|
5699
5729
|
files_analyzed: number
|
|
5700
5730
|
/**
|
|
5701
|
-
*
|
|
5731
|
+
* Real functions scored across the analyzed files. This counts functions
|
|
5732
|
+
* only, so it is smaller than the sum of `file_scores[].function_count`,
|
|
5733
|
+
* which also counts the synthetic per-file units (`<module>` for
|
|
5734
|
+
* module-scope branching, `<template>` and `<snippet:NAME>` for component
|
|
5735
|
+
* templates). The complexity aggregates below, including
|
|
5736
|
+
* `average_cyclomatic` and `p90_cyclomatic`, are computed over that larger
|
|
5737
|
+
* population rather than over this count.
|
|
5702
5738
|
*/
|
|
5703
5739
|
functions_analyzed: number
|
|
5704
5740
|
/**
|
|
@@ -12361,6 +12397,11 @@ duplication?: (DupesReportPayload | null)
|
|
|
12361
12397
|
* Complexity findings scoped to the audit changeset.
|
|
12362
12398
|
*/
|
|
12363
12399
|
complexity?: (HealthReport | null)
|
|
12400
|
+
/**
|
|
12401
|
+
* Branching conservation across the changeset. Absent when no base
|
|
12402
|
+
* comparison ran.
|
|
12403
|
+
*/
|
|
12404
|
+
branching?: (BranchingReport | null)
|
|
12364
12405
|
}
|
|
12365
12406
|
/**
|
|
12366
12407
|
* The ranked, capped decision surface plus the set of signal_ids the
|
|
@@ -12776,6 +12817,200 @@ expert: string[]
|
|
|
12776
12817
|
*/
|
|
12777
12818
|
bus_factor_one?: boolean
|
|
12778
12819
|
}
|
|
12820
|
+
/**
|
|
12821
|
+
* The brief's branching section.
|
|
12822
|
+
*/
|
|
12823
|
+
export interface BranchingReport {
|
|
12824
|
+
/**
|
|
12825
|
+
* Files carrying the split signature: branching within `tolerance` of
|
|
12826
|
+
* where it was, more functions, a smaller largest function. Empty when
|
|
12827
|
+
* none do, which is the common case and is not itself a finding. See
|
|
12828
|
+
* `SplitInPlace` for why this describes a shape rather than asserting a
|
|
12829
|
+
* refactor.
|
|
12830
|
+
*/
|
|
12831
|
+
split_in_place: SplitInPlace[]
|
|
12832
|
+
/**
|
|
12833
|
+
* The band inside which a file's branching counts as held. Published
|
|
12834
|
+
* because a claim against an unpublished threshold is not reproducible by
|
|
12835
|
+
* a consumer.
|
|
12836
|
+
*/
|
|
12837
|
+
tolerance: number
|
|
12838
|
+
scope: BranchingScope
|
|
12839
|
+
branch_points: BranchingMetric
|
|
12840
|
+
functions: BranchingMetric
|
|
12841
|
+
peak_unit_cyclomatic: BranchingMetric
|
|
12842
|
+
/**
|
|
12843
|
+
* Base-side branch points of the files that have no head entry.
|
|
12844
|
+
*/
|
|
12845
|
+
branch_points_only_in_base: number
|
|
12846
|
+
cognitive: BranchingCognitive
|
|
12847
|
+
/**
|
|
12848
|
+
* The files that moved the numbers most, largest absolute branch-point
|
|
12849
|
+
* change first.
|
|
12850
|
+
*/
|
|
12851
|
+
by_file: BranchingFileDelta[]
|
|
12852
|
+
/**
|
|
12853
|
+
* Files with a change that the list did not name.
|
|
12854
|
+
*/
|
|
12855
|
+
by_file_omitted: number
|
|
12856
|
+
}
|
|
12857
|
+
/**
|
|
12858
|
+
* One file present on both revisions whose branching held while it gained
|
|
12859
|
+
* functions and its largest function shrank.
|
|
12860
|
+
*
|
|
12861
|
+
* Local by construction: nothing here depends on any other file, so unrelated
|
|
12862
|
+
* work in the changeset cannot make it more or less true. A set-level
|
|
12863
|
+
* classifier cannot make this claim, because a changeset contains arbitrary
|
|
12864
|
+
* other work and an aggregate cannot attribute.
|
|
12865
|
+
*
|
|
12866
|
+
* It is a description, not an inference. The three conditions are the
|
|
12867
|
+
* signature a split leaves, and they are also satisfiable without one: the
|
|
12868
|
+
* peak is a file-level maximum (`FileBranching::peak_cyclomatic`), so it can
|
|
12869
|
+
* fall because the largest function left the file while arriving helpers
|
|
12870
|
+
* happen to carry the branching it took with it. Both numbers are reported so
|
|
12871
|
+
* a reader can see that for themselves, and the rendered text states what was
|
|
12872
|
+
* measured rather than concluding a refactor happened.
|
|
12873
|
+
*
|
|
12874
|
+
* Files carrying synthetic template units are excluded, because those units
|
|
12875
|
+
* are outside every count here, so the numbers would not describe the file a
|
|
12876
|
+
* reader opens. Test paths are excluded too: their totals are reported in
|
|
12877
|
+
* `BranchingScope` instead.
|
|
12878
|
+
*/
|
|
12879
|
+
export interface SplitInPlace {
|
|
12880
|
+
/**
|
|
12881
|
+
* Root-relative path.
|
|
12882
|
+
*/
|
|
12883
|
+
path: string
|
|
12884
|
+
/**
|
|
12885
|
+
* Branch points on the base revision.
|
|
12886
|
+
*/
|
|
12887
|
+
branch_points_before: number
|
|
12888
|
+
/**
|
|
12889
|
+
* And on head. Within `tolerance` of `branch_points_before`, which is what
|
|
12890
|
+
* "held" means here. Both are reported because one number alone cannot be
|
|
12891
|
+
* checked.
|
|
12892
|
+
*/
|
|
12893
|
+
branch_points_after: number
|
|
12894
|
+
/**
|
|
12895
|
+
* Accounted functions before the split.
|
|
12896
|
+
*/
|
|
12897
|
+
functions_before: number
|
|
12898
|
+
/**
|
|
12899
|
+
* Accounted functions after it.
|
|
12900
|
+
*/
|
|
12901
|
+
functions_after: number
|
|
12902
|
+
/**
|
|
12903
|
+
* Highest single-function cyclomatic score before.
|
|
12904
|
+
*/
|
|
12905
|
+
peak_before: number
|
|
12906
|
+
/**
|
|
12907
|
+
* And after. It falls by construction when a function is split, which is
|
|
12908
|
+
* why it is evidence here and never a metric to celebrate.
|
|
12909
|
+
*/
|
|
12910
|
+
peak_after: number
|
|
12911
|
+
}
|
|
12912
|
+
/**
|
|
12913
|
+
* Size and composition of the compared set.
|
|
12914
|
+
*/
|
|
12915
|
+
export interface BranchingScope {
|
|
12916
|
+
/**
|
|
12917
|
+
* Files carrying units on both revisions.
|
|
12918
|
+
*/
|
|
12919
|
+
files_both: number
|
|
12920
|
+
/**
|
|
12921
|
+
* Files carrying units on the head revision only.
|
|
12922
|
+
*/
|
|
12923
|
+
files_added: number
|
|
12924
|
+
/**
|
|
12925
|
+
* Files that carried units on the base revision only, whether they were
|
|
12926
|
+
* deleted or merely lost every accounted unit. Reported, and excluded from
|
|
12927
|
+
* every headline number: such a file contributes its whole base-side total
|
|
12928
|
+
* as a fall with no head counterpart.
|
|
12929
|
+
*/
|
|
12930
|
+
files_only_in_base: number
|
|
12931
|
+
/**
|
|
12932
|
+
* Branch points on test-shaped paths within the head totals. Test code
|
|
12933
|
+
* routinely dominates both terms, so a reader needs to see its share
|
|
12934
|
+
* before reading the headline.
|
|
12935
|
+
*/
|
|
12936
|
+
test_branch_points: number
|
|
12937
|
+
/**
|
|
12938
|
+
* Functions on test-shaped paths within the head totals.
|
|
12939
|
+
*/
|
|
12940
|
+
test_functions: number
|
|
12941
|
+
/**
|
|
12942
|
+
* Share of head branch points owned by the single largest file, so a
|
|
12943
|
+
* reader can see when one vendored or generated file owns the number.
|
|
12944
|
+
*/
|
|
12945
|
+
largest_file_share_of_branch_points: number
|
|
12946
|
+
}
|
|
12947
|
+
/**
|
|
12948
|
+
* One metric across the two revisions.
|
|
12949
|
+
*/
|
|
12950
|
+
export interface BranchingMetric {
|
|
12951
|
+
/**
|
|
12952
|
+
* Value on the base revision.
|
|
12953
|
+
*/
|
|
12954
|
+
previous: number
|
|
12955
|
+
/**
|
|
12956
|
+
* Value on the head revision.
|
|
12957
|
+
*/
|
|
12958
|
+
current: number
|
|
12959
|
+
/**
|
|
12960
|
+
* `current - previous`. Signed, so a consumer never has to infer direction
|
|
12961
|
+
* from a separate field.
|
|
12962
|
+
*/
|
|
12963
|
+
delta: number
|
|
12964
|
+
}
|
|
12965
|
+
/**
|
|
12966
|
+
* The cognitive figure and what drove it.
|
|
12967
|
+
*
|
|
12968
|
+
* `previous` and `current` exclude prop-count and hook-density increments.
|
|
12969
|
+
* Both are cognitive-only, and prop count records an excess over a floor, so
|
|
12970
|
+
* it is superlinear in a split and would move this number with branching and
|
|
12971
|
+
* nesting both flat. This therefore does not match the cognitive score the
|
|
12972
|
+
* complexity findings report.
|
|
12973
|
+
*/
|
|
12974
|
+
export interface BranchingCognitive {
|
|
12975
|
+
/**
|
|
12976
|
+
* Cognitive weight on the base revision.
|
|
12977
|
+
*/
|
|
12978
|
+
previous: number
|
|
12979
|
+
/**
|
|
12980
|
+
* Cognitive weight on the head revision.
|
|
12981
|
+
*/
|
|
12982
|
+
current: number
|
|
12983
|
+
/**
|
|
12984
|
+
* `current - previous`.
|
|
12985
|
+
*/
|
|
12986
|
+
delta: number
|
|
12987
|
+
/**
|
|
12988
|
+
* Change in the summed nesting depth behind those increments.
|
|
12989
|
+
*/
|
|
12990
|
+
nesting_weight_delta: number
|
|
12991
|
+
/**
|
|
12992
|
+
* What the improvement is attributable to, absent when cognitive did not
|
|
12993
|
+
* fall. There is nothing to attribute when the number rose or held.
|
|
12994
|
+
*/
|
|
12995
|
+
attributed_to?: (CognitiveAttribution | null)
|
|
12996
|
+
}
|
|
12997
|
+
/**
|
|
12998
|
+
* One file's contribution to the change.
|
|
12999
|
+
*/
|
|
13000
|
+
export interface BranchingFileDelta {
|
|
13001
|
+
/**
|
|
13002
|
+
* Root-relative path.
|
|
13003
|
+
*/
|
|
13004
|
+
path: string
|
|
13005
|
+
/**
|
|
13006
|
+
* Change in branch points for this file.
|
|
13007
|
+
*/
|
|
13008
|
+
branch_points_delta: number
|
|
13009
|
+
/**
|
|
13010
|
+
* Change in accounted functions for this file.
|
|
13011
|
+
*/
|
|
13012
|
+
functions_delta: number
|
|
13013
|
+
}
|
|
12779
13014
|
/**
|
|
12780
13015
|
* The separable `decision-surface` envelope: the single call that puts taste-
|
|
12781
13016
|
* decisions in front of a human, callable WITHOUT the full pipeline (the
|
|
@@ -12962,6 +13197,13 @@ deltas: ReviewDeltas
|
|
|
12962
13197
|
weakening: WeakeningSignal[]
|
|
12963
13198
|
routing: RoutingFacts
|
|
12964
13199
|
decisions: DecisionSurface
|
|
13200
|
+
/**
|
|
13201
|
+
* Branching conservation across the changeset: total branching against
|
|
13202
|
+
* the number of functions now holding it. Absent when no base comparison
|
|
13203
|
+
* ran, which keeps the wire shape byte-identical for a consumer that
|
|
13204
|
+
* never had a base snapshot.
|
|
13205
|
+
*/
|
|
13206
|
+
branching?: (BranchingReport | null)
|
|
12965
13207
|
}
|
|
12966
13208
|
/**
|
|
12967
13209
|
* The review direction artifact: the order to review in, the coherent units,
|
|
@@ -13300,6 +13542,75 @@ reason?: (string | null)
|
|
|
13300
13542
|
*/
|
|
13301
13543
|
reason_present: boolean
|
|
13302
13544
|
}
|
|
13545
|
+
/**
|
|
13546
|
+
* Versioned readiness envelope emitted by `fallow doctor --format json`.
|
|
13547
|
+
*/
|
|
13548
|
+
export interface DoctorOutput {
|
|
13549
|
+
schema_version: DoctorSchemaVersion
|
|
13550
|
+
version: ToolVersion
|
|
13551
|
+
root: DoctorProjectRoot
|
|
13552
|
+
status: DoctorStatus
|
|
13553
|
+
summary: DoctorSummary
|
|
13554
|
+
/**
|
|
13555
|
+
* Checks in stable contract order.
|
|
13556
|
+
*/
|
|
13557
|
+
checks: DoctorCheck[]
|
|
13558
|
+
}
|
|
13559
|
+
/**
|
|
13560
|
+
* Counts for every per-check status.
|
|
13561
|
+
*/
|
|
13562
|
+
export interface DoctorSummary {
|
|
13563
|
+
/**
|
|
13564
|
+
* Successful checks.
|
|
13565
|
+
*/
|
|
13566
|
+
pass: number
|
|
13567
|
+
/**
|
|
13568
|
+
* Advisory checks.
|
|
13569
|
+
*/
|
|
13570
|
+
warn: number
|
|
13571
|
+
/**
|
|
13572
|
+
* Failed checks.
|
|
13573
|
+
*/
|
|
13574
|
+
fail: number
|
|
13575
|
+
/**
|
|
13576
|
+
* Inapplicable or prerequisite-blocked checks.
|
|
13577
|
+
*/
|
|
13578
|
+
skipped: number
|
|
13579
|
+
}
|
|
13580
|
+
/**
|
|
13581
|
+
* One deterministic doctor check result.
|
|
13582
|
+
*/
|
|
13583
|
+
export interface DoctorCheck {
|
|
13584
|
+
id: DoctorCheckId
|
|
13585
|
+
category: DoctorCheckCategory
|
|
13586
|
+
status: DoctorCheckStatus
|
|
13587
|
+
/**
|
|
13588
|
+
* Whether failure makes the project not ready.
|
|
13589
|
+
*/
|
|
13590
|
+
required: boolean
|
|
13591
|
+
/**
|
|
13592
|
+
* Human-readable result with no host-specific absolute paths.
|
|
13593
|
+
*/
|
|
13594
|
+
message: string
|
|
13595
|
+
/**
|
|
13596
|
+
* Optional actionable next command.
|
|
13597
|
+
*/
|
|
13598
|
+
remediation?: (DoctorRemediation | null)
|
|
13599
|
+
}
|
|
13600
|
+
/**
|
|
13601
|
+
* Actionable remediation attached to a doctor check.
|
|
13602
|
+
*/
|
|
13603
|
+
export interface DoctorRemediation {
|
|
13604
|
+
/**
|
|
13605
|
+
* Command the user or agent can choose to run.
|
|
13606
|
+
*/
|
|
13607
|
+
command: string
|
|
13608
|
+
cwd: DoctorProjectRoot
|
|
13609
|
+
/**
|
|
13610
|
+
* Whether running the command can modify project files or dependencies.
|
|
13611
|
+
*/
|
|
13612
|
+
mutating: boolean
|
|
13613
|
+
}
|
|
13303
13614
|
/**
|
|
13304
13615
|
* Envelope emitted by `fallow type-aware status --format json`.
|
|
13305
13616
|
*/
|
|
@@ -13905,6 +14216,12 @@ severity: CodeClimateSeverity
|
|
|
13905
14216
|
*/
|
|
13906
14217
|
fingerprint: string
|
|
13907
14218
|
location: CodeClimateLocation
|
|
14219
|
+
/**
|
|
14220
|
+
* Other source locations that provide evidence for the finding. GitLab's
|
|
14221
|
+
* Code Quality widget ignores this standard CodeClimate field, but Fallow
|
|
14222
|
+
* preserves it for review-comment rendering.
|
|
14223
|
+
*/
|
|
14224
|
+
other_locations?: CodeClimateLocation[]
|
|
13908
14225
|
/**
|
|
13909
14226
|
* Optional owner attribution used by grouped dead-code output.
|
|
13910
14227
|
*/
|
|
@@ -13926,13 +14243,17 @@ path: string
|
|
|
13926
14243
|
lines: CodeClimateLines
|
|
13927
14244
|
}
|
|
13928
14245
|
/**
|
|
13929
|
-
*
|
|
14246
|
+
* Inclusive line range for [`CodeClimateLocation`].
|
|
13930
14247
|
*/
|
|
13931
14248
|
export interface CodeClimateLines {
|
|
13932
14249
|
/**
|
|
13933
14250
|
* 1-based start line.
|
|
13934
14251
|
*/
|
|
13935
14252
|
begin: number
|
|
14253
|
+
/**
|
|
14254
|
+
* Inclusive 1-based end line. Omitted for point findings.
|
|
14255
|
+
*/
|
|
14256
|
+
end?: (number | null)
|
|
13936
14257
|
}
|
|
13937
14258
|
/**
|
|
13938
14259
|
* Structured JSON error emitted on stdout when `--format json` is active and a
|