xarray-spatial 0.9.7__tar.gz → 0.9.9__tar.gz
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.
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/bench.md +6 -6
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/efficiency-audit.md +1 -1
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/release-major.md +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/release-minor.md +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/release-patch.md +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/sweep-accuracy.md +67 -28
- xarray_spatial-0.9.9/.claude/commands/sweep-api-consistency.md +256 -0
- xarray_spatial-0.9.9/.claude/commands/sweep-metadata.md +297 -0
- xarray_spatial-0.9.9/.claude/commands/sweep-performance.md +327 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/sweep-security.md +70 -29
- xarray_spatial-0.9.9/.claude/commands/sweep-test-coverage.md +255 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/validate.md +1 -1
- xarray_spatial-0.9.9/.claude/sweep-accuracy-state.csv +36 -0
- xarray_spatial-0.9.9/.claude/sweep-api-consistency-state.csv +1 -0
- xarray_spatial-0.9.9/.claude/sweep-metadata-state.csv +1 -0
- xarray_spatial-0.9.9/.claude/sweep-performance-state.csv +47 -0
- xarray_spatial-0.9.9/.claude/sweep-security-state.csv +50 -0
- xarray_spatial-0.9.9/.claude/sweep-test-coverage-state.csv +1 -0
- xarray_spatial-0.9.9/.gitattributes +4 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/benchmarks.yml +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/test.yml +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/CHANGELOG.md +117 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/CONTRIBUTING.md +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/PKG-INFO +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/README.md +2 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/RELEASE.md +1 -1
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/PKG-INFO +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/SOURCES.txt +22 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/_version.py +3 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/aspect.py +4 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/bilateral.py +12 -4
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/convolution.py +7 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/cost_distance.py +98 -5
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/curvature.py +8 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/dasymetric.py +92 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/diffusion.py +170 -29
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/edge_detection.py +6 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/emerging_hotspots.py +58 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/erosion.py +97 -23
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/experimental/min_observable_height.py +39 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/flood.py +21 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/focal.py +53 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geodesic.py +49 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/__init__.py +317 -31
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_geotags.py +94 -19
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_gpu_decode.py +53 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_reader.py +172 -38
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_writer.py +167 -75
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_cog_http_concurrent.py +180 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_edge_cases.py +5 -1
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_georef_edges.py +157 -0
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_geotags.py +255 -0
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_header.py +299 -0
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_metadata_round_trip_1484.py +418 -0
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_polish_1488.py +339 -0
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_predictor_fp_write_1313.py +203 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_predictor_multisample.py +50 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_reader.py +68 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_streaming_write.py +71 -0
- xarray_spatial-0.9.9/xrspatial/geotiff/tests/test_writer_matrix.py +253 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/glcm.py +30 -9
- xarray_spatial-0.9.9/xrspatial/gpu_rtx/_memory.py +60 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/hillshade.py +4 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/mesh_utils.py +29 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/viewshed.py +4 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/basin_d8.py +89 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/fill_d8.py +94 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_accumulation_d8.py +89 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_accumulation_dinf.py +92 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_accumulation_mfd.py +91 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_direction_d8.py +8 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_direction_dinf.py +8 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_direction_mfd.py +73 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_length_d8.py +98 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_length_dinf.py +99 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_length_mfd.py +102 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_path_d8.py +90 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_path_dinf.py +93 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/flow_path_mfd.py +89 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/hand_d8.py +99 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/hand_dinf.py +100 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/hand_mfd.py +142 -29
- xarray_spatial-0.9.9/xrspatial/hydro/sink_d8.py +513 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/snap_pour_point_d8.py +96 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_link_d8.py +94 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_link_dinf.py +98 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_link_mfd.py +96 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_order_d8.py +97 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_order_dinf.py +102 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/stream_order_mfd.py +101 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_basin_d8.py +73 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_fill_d8.py +73 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_accumulation_d8.py +58 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_accumulation_dinf.py +58 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_accumulation_mfd.py +57 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_direction_mfd.py +55 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_length_d8.py +69 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_length_dinf.py +75 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_length_mfd.py +74 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_path_d8.py +79 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_path_dinf.py +88 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_path_mfd.py +90 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_hand_d8.py +84 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_hand_dinf.py +88 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_hand_mfd.py +139 -0
- xarray_spatial-0.9.9/xrspatial/hydro/tests/test_sink_d8.py +415 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_snap_pour_point_d8.py +84 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_link_d8.py +77 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_link_dinf.py +77 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_link_mfd.py +94 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_order_d8.py +77 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_order_dinf.py +80 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_stream_order_mfd.py +92 -0
- xarray_spatial-0.9.9/xrspatial/hydro/tests/test_validate_cellsize.py +113 -0
- xarray_spatial-0.9.9/xrspatial/hydro/tests/test_validate_scalar_params.py +124 -0
- xarray_spatial-0.9.9/xrspatial/hydro/tests/test_validate_secondary_args.py +137 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_watershed_d8.py +88 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_watershed_dinf.py +84 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_watershed_mfd.py +88 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/twi_d8.py +8 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/watershed_d8.py +90 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/watershed_dinf.py +92 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/watershed_mfd.py +91 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_idw.py +50 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_kriging.py +74 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_spline.py +67 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/kde.py +52 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mahalanobis.py +119 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/combine.py +155 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/sensitivity.py +6 -1
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/weights.py +15 -3
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/morphology.py +92 -38
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/multispectral.py +89 -1
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/pathfinding.py +25 -4
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/polygonize.py +10 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/rasterize.py +9 -5
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/__init__.py +321 -73
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_crs_utils.py +13 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_grid.py +84 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_itrf.py +20 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_vertical.py +18 -0
- xarray_spatial-0.9.9/xrspatial/resample.py +1410 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/sieve.py +89 -18
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/sky_view_factor.py +152 -15
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/slope.py +4 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/surface_distance.py +94 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/terrain.py +72 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/terrain_metrics.py +51 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_bilateral.py +46 -0
- xarray_spatial-0.9.9/xrspatial/tests/test_convolution.py +38 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_cost_distance.py +153 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_curvature.py +12 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dasymetric.py +128 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_diffusion.py +177 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_edge_detection.py +27 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_emerging_hotspots.py +84 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_erosion.py +135 -1
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_flood.py +68 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_focal.py +37 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_geodesic_aspect.py +35 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_geodesic_slope.py +41 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_glcm.py +88 -16
- xarray_spatial-0.9.9/xrspatial/tests/test_gpu_rtx_memory.py +175 -0
- xarray_spatial-0.9.9/xrspatial/tests/test_gpu_rtx_mesh.py +120 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_interpolation.py +231 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_kde.py +38 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_mahalanobis.py +123 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_mcda.py +247 -7
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_min_observable_height.py +56 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_morphology.py +173 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_multispectral.py +122 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_pathfinding.py +52 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_polygonize.py +46 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_rasterize.py +85 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_reproject.py +1238 -1
- xarray_spatial-0.9.9/xrspatial/tests/test_resample.py +1275 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_sieve.py +30 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_sky_view_factor.py +207 -2
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_surface_distance.py +119 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_terrain.py +48 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_terrain_metrics.py +17 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_utils.py +83 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/utils.py +35 -6
- xarray_spatial-0.9.7/.claude/commands/sweep-performance.md +0 -502
- xarray_spatial-0.9.7/.claude/sweep-accuracy-state.json +0 -22
- xarray_spatial-0.9.7/.claude/sweep-performance-state.json +0 -50
- xarray_spatial-0.9.7/.claude/sweep-security-state.json +0 -108
- xarray_spatial-0.9.7/.gitattributes +0 -2
- xarray_spatial-0.9.7/xrspatial/geotiff/tests/test_geotags.py +0 -109
- xarray_spatial-0.9.7/xrspatial/geotiff/tests/test_header.py +0 -123
- xarray_spatial-0.9.7/xrspatial/hydro/sink_d8.py +0 -276
- xarray_spatial-0.9.7/xrspatial/hydro/tests/test_sink_d8.py +0 -177
- xarray_spatial-0.9.7/xrspatial/resample.py +0 -791
- xarray_spatial-0.9.7/xrspatial/tests/test_resample.py +0 -380
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/backend-parity.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/dask-notebook.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/new-issues.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/review-pr.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/rockout.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.claude/commands/user-guide-notebook.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.efficiency-audit-baseline.json +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.efficiency-audit-baseline.prev.json +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/ISSUE_TEMPLATE/feature-proposal.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/labeler.yml +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/pull_request_template.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/labeler.yml +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.github/workflows/pypi-publish.yml +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.gitignore +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/.readthedocs.yml +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/CODE_OF_CONDUCT.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/Citation-styles.md +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/LICENSE.txt +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/MANIFEST.in +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/codecov.yml +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/pyproject.toml +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/setup.cfg +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/setup.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/dependency_links.txt +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/entry_points.txt +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/not-zip-safe +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/requires.txt +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xarray_spatial.egg-info/top_level.txt +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/__main__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/accessor.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/analytics.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/balanced_allocation.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/bump.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/classify.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/contour.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/corridor.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/dataset_support.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/blue_band.nc +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/green_band.nc +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/nir_band.nc +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/red_band.nc +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/swir1_band.nc +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/datasets/sentinel-2/swir2_band.nc +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/diagnostics.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/experimental/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/fire.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_compression.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_dtypes.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_header.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/_vrt.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/bench_vs_rioxarray.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/conftest.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_accessor_io.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_accuracy_1081.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_cog.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_compression.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_compression_level.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_dtype_read.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_features.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_jpeg.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_jpeg2000.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_lerc.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_lz4.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_security.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_vrt_write.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/geotiff/tests/test_writer.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/gpu_rtx/cuda_utils.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hillshade.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/_boundary_store.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/conftest.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_direction_d8.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_flow_direction_dinf.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/hydro/tests/test_twi_d8.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/interpolate/_validation.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/constrain.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/mcda/standardize.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/normalize.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/perlin.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/polygon_clip.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/preview.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/proximity.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_datum_grids.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_interpolate.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_lite_crs.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_merge.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_projections.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_projections_cuda.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/_transform.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/at_bev_AT_GIS_GRID.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/au_icsm_A66_National_13_09_01.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/be_ign_bd72lb72_etrs89lb08.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/ch_swisstopo_CHENyx06_ETRS.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/de_adv_BETA2007.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/es_ign_SPED2ETV2.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/nl_nsgi_rdcorr2018.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/pt_dgt_D73_ETRS89_geo.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/uk_os_OSTN15_NTv2_OSGBtoETRS.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_nga_egm96_15.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_alaska.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_conus.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_hawaii.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_nadcon5_nad27_nad83_1986_conus.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/reproject/grids/us_noaa_prvi.tif +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/__init__.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/bench_reproject_vs_rioxarray.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/conftest.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/general_checks.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_accessor.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_analytics.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_aspect.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_balanced_allocation.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_bump.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_classify.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_contour.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_corridor.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dask_cupy_gaps.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dask_laziness.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_dataset_support.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_datasets.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_diagnostics.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_fire.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_fused_overlap.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_glcm_metric_order.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_hillshade.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_hypsometric_integral.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_lite_crs.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_morphology_derived.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_multi_overlap.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_normalize.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_northness_eastness.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_perlin.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_polygon_clip.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_preview.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_proximity.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_rasterize_accuracy.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_rechunk_no_shuffle.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_sieve_gdal_parity.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_slope.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_validation.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_viewshed.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_visibility.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/tests/test_zonal.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/viewshed.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/visibility.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/worley.py +0 -0
- {xarray_spatial-0.9.7 → xarray_spatial-0.9.9}/xrspatial/zonal.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bench: Local Performance Comparison
|
|
2
2
|
|
|
3
|
-
Run ASV benchmarks for the current branch against
|
|
3
|
+
Run ASV benchmarks for the current branch against main and report regressions
|
|
4
4
|
and improvements. The prompt is: $ARGUMENTS
|
|
5
5
|
|
|
6
6
|
---
|
|
@@ -9,7 +9,7 @@ and improvements. The prompt is: $ARGUMENTS
|
|
|
9
9
|
|
|
10
10
|
1. If $ARGUMENTS names specific benchmark classes or functions (e.g. `Slope`,
|
|
11
11
|
`flow_accumulation`), use those directly.
|
|
12
|
-
2. If $ARGUMENTS is empty or says "auto", run `git diff origin/
|
|
12
|
+
2. If $ARGUMENTS is empty or says "auto", run `git diff origin/main --name-only`
|
|
13
13
|
to find changed source files under `xrspatial/`. Map each changed file to the
|
|
14
14
|
corresponding benchmark module in `benchmarks/benchmarks/`. Use the filename
|
|
15
15
|
and imports to match (e.g. changes to `slope.py` map to `benchmarks/benchmarks/slope.py`).
|
|
@@ -30,7 +30,7 @@ and improvements. The prompt is: $ARGUMENTS
|
|
|
30
30
|
Run ASV in continuous-comparison mode from the `benchmarks/` directory:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
|
-
cd benchmarks && asv continuous origin/
|
|
33
|
+
cd benchmarks && asv continuous origin/main HEAD -b "<regex>" -e
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
Where `<regex>` is a pattern matching the benchmark classes identified in Step 1
|
|
@@ -64,7 +64,7 @@ Parse the output and classify each result:
|
|
|
64
64
|
## Step 5 -- Generate the report
|
|
65
65
|
|
|
66
66
|
```
|
|
67
|
-
## Benchmark Report: <branch> vs
|
|
67
|
+
## Benchmark Report: <branch> vs main
|
|
68
68
|
|
|
69
69
|
### Changed files
|
|
70
70
|
- <list of changed source files>
|
|
@@ -74,7 +74,7 @@ Parse the output and classify each result:
|
|
|
74
74
|
|
|
75
75
|
### Results
|
|
76
76
|
|
|
77
|
-
| Benchmark |
|
|
77
|
+
| Benchmark | main | HEAD | Ratio | Status |
|
|
78
78
|
|------------------------------------|-----------|-----------|-------|------------|
|
|
79
79
|
| slope.Slope.time_numpy | 3.45 ms | 3.51 ms | 1.02x | UNCHANGED |
|
|
80
80
|
| slope.Slope.time_dask_numpy | 8.12 ms | 4.23 ms | 0.52x | IMPROVED |
|
|
@@ -124,4 +124,4 @@ Do NOT write benchmark files automatically. Report the gap and propose, then wai
|
|
|
124
124
|
analysis (unless the user explicitly asks for a benchmark to be written in
|
|
125
125
|
response to Step 6).
|
|
126
126
|
- If $ARGUMENTS says "compare <branch1> <branch2>", run
|
|
127
|
-
`asv continuous <branch1> <branch2>` instead of the default origin/
|
|
127
|
+
`asv continuous <branch1> <branch2>` instead of the default origin/main vs HEAD.
|
|
@@ -267,7 +267,7 @@ Thresholds: IMPROVED < 0.8x, REGRESSION > 1.2x, else UNCHANGED.
|
|
|
267
267
|
- If $ARGUMENTS includes a severity filter (e.g. "high only"), only report
|
|
268
268
|
findings at that severity level.
|
|
269
269
|
- If $ARGUMENTS includes "diff" or "changed", restrict the audit to files
|
|
270
|
-
changed on the current branch vs origin/
|
|
270
|
+
changed on the current branch vs origin/main.
|
|
271
271
|
- Baseline benchmark scripts are disposable. Clean up `/tmp/` scripts after
|
|
272
272
|
capturing results.
|
|
273
273
|
- The 512x512 array size is a default. If $ARGUMENTS includes a size like
|
|
@@ -16,7 +16,7 @@ $ARGUMENTS
|
|
|
16
16
|
## Step 2 -- Create a release branch
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
git checkout
|
|
19
|
+
git checkout main && git pull
|
|
20
20
|
git checkout -b release/vX.Y.Z
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -49,7 +49,7 @@ git push -u origin release/vX.Y.Z
|
|
|
49
49
|
|
|
50
50
|
## Step 5 -- Verify CI
|
|
51
51
|
|
|
52
|
-
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z major release."` to open a PR against
|
|
52
|
+
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z major release."` to open a PR against main.
|
|
53
53
|
2. Wait for CI:
|
|
54
54
|
```bash
|
|
55
55
|
gh pr checks <PR_NUMBER> --watch
|
|
@@ -65,7 +65,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
|
|
|
65
65
|
## Step 7 -- Tag the release
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
-
git checkout
|
|
68
|
+
git checkout main && git pull
|
|
69
69
|
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
|
70
70
|
git push origin vX.Y.Z
|
|
71
71
|
```
|
|
@@ -16,7 +16,7 @@ $ARGUMENTS
|
|
|
16
16
|
## Step 2 -- Create a release branch
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
git checkout
|
|
19
|
+
git checkout main && git pull
|
|
20
20
|
git checkout -b release/vX.Y.Z
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -49,7 +49,7 @@ git push -u origin release/vX.Y.Z
|
|
|
49
49
|
|
|
50
50
|
## Step 5 -- Verify CI
|
|
51
51
|
|
|
52
|
-
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z minor release."` to open a PR against
|
|
52
|
+
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z minor release."` to open a PR against main.
|
|
53
53
|
2. Wait for CI:
|
|
54
54
|
```bash
|
|
55
55
|
gh pr checks <PR_NUMBER> --watch
|
|
@@ -65,7 +65,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
|
|
|
65
65
|
## Step 7 -- Tag the release
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
-
git checkout
|
|
68
|
+
git checkout main && git pull
|
|
69
69
|
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
|
70
70
|
git push origin vX.Y.Z
|
|
71
71
|
```
|
|
@@ -16,7 +16,7 @@ $ARGUMENTS
|
|
|
16
16
|
## Step 2 -- Create a release branch
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
git checkout
|
|
19
|
+
git checkout main && git pull
|
|
20
20
|
git checkout -b release/vX.Y.Z
|
|
21
21
|
```
|
|
22
22
|
|
|
@@ -46,7 +46,7 @@ git push -u origin release/vX.Y.Z
|
|
|
46
46
|
|
|
47
47
|
## Step 5 -- Verify CI
|
|
48
48
|
|
|
49
|
-
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z patch release."` to open a PR against
|
|
49
|
+
1. Run `gh pr create --title "Release vX.Y.Z" --body "Changelog update for vX.Y.Z patch release."` to open a PR against main.
|
|
50
50
|
2. Wait for CI:
|
|
51
51
|
```bash
|
|
52
52
|
gh pr checks <PR_NUMBER> --watch
|
|
@@ -62,7 +62,7 @@ gh pr merge <PR_NUMBER> --merge --delete-branch
|
|
|
62
62
|
## Step 7 -- Tag the release
|
|
63
63
|
|
|
64
64
|
```bash
|
|
65
|
-
git checkout
|
|
65
|
+
git checkout main && git pull
|
|
66
66
|
git tag -a vX.Y.Z -m "Version X.Y.Z"
|
|
67
67
|
git push origin vX.Y.Z
|
|
68
68
|
```
|
|
@@ -36,28 +36,30 @@ Store results in memory -- do NOT write intermediate files.
|
|
|
36
36
|
|
|
37
37
|
## Step 2 -- Load inspection state
|
|
38
38
|
|
|
39
|
-
Read `.claude/sweep-accuracy-state.
|
|
39
|
+
Read `.claude/sweep-accuracy-state.csv`.
|
|
40
40
|
|
|
41
41
|
If it does not exist, treat every module as never-inspected.
|
|
42
42
|
|
|
43
43
|
If `$ARGUMENTS` contains `--reset-state`, delete the file and treat
|
|
44
44
|
everything as never-inspected.
|
|
45
45
|
|
|
46
|
-
State file schema:
|
|
47
|
-
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"slope": {
|
|
52
|
-
"last_inspected": "2026-03-28T14:00:00Z",
|
|
53
|
-
"issue": 1042,
|
|
54
|
-
"severity_max": "HIGH",
|
|
55
|
-
"categories_found": [1, 3]
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
46
|
+
State file schema (one row per module):
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
module,last_inspected,issue,severity_max,categories_found,notes
|
|
50
|
+
slope,2026-03-28,1042,HIGH,1;3,"optional single-line notes"
|
|
59
51
|
```
|
|
60
52
|
|
|
53
|
+
- `categories_found` is a semicolon-separated integer list (empty when null).
|
|
54
|
+
- `notes` is CSV-quoted; newlines must be flattened to spaces on write so
|
|
55
|
+
every module stays exactly one line.
|
|
56
|
+
|
|
57
|
+
The file is registered with `merge=union` in `.gitattributes`, so two
|
|
58
|
+
parallel sweeps touching different modules auto-merge without conflict.
|
|
59
|
+
A transient duplicate-row state can occur after a merge if both branches
|
|
60
|
+
modified the same module; the read-update-write cycle in step 5 keys rows
|
|
61
|
+
by `module` and last-write-wins, so the next write cleans up.
|
|
62
|
+
|
|
61
63
|
## Step 3 -- Score each module
|
|
62
64
|
|
|
63
65
|
```
|
|
@@ -191,19 +193,54 @@ xrspatial/tests/general_checks.py for the cross-backend comparison helpers.
|
|
|
191
193
|
3. For each real issue found, assign a severity (CRITICAL/HIGH/MEDIUM/LOW)
|
|
192
194
|
and note the exact file and line number.
|
|
193
195
|
|
|
194
|
-
4. If any CRITICAL or
|
|
195
|
-
(GitHub issue, worktree branch, fix, tests, and PR).
|
|
196
|
-
For
|
|
196
|
+
4. If any CRITICAL, HIGH, or MEDIUM issue is found, run /rockout to fix it
|
|
197
|
+
end-to-end (GitHub issue, worktree branch, fix, tests, and PR).
|
|
198
|
+
For LOW issues, document them but do not fix.
|
|
197
199
|
|
|
198
200
|
5. After finishing (whether you found issues or not), update the inspection
|
|
199
|
-
state file .claude/sweep-accuracy-state.
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
201
|
+
state file .claude/sweep-accuracy-state.csv. The file is row-per-module
|
|
202
|
+
CSV with header:
|
|
203
|
+
|
|
204
|
+
`module,last_inspected,issue,severity_max,categories_found,notes`
|
|
205
|
+
|
|
206
|
+
Use this Python pattern to read, update, and write it (do NOT hand-edit
|
|
207
|
+
the file -- always go through csv.DictReader / csv.DictWriter so quoting
|
|
208
|
+
stays consistent):
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
import csv
|
|
212
|
+
from pathlib import Path
|
|
213
|
+
|
|
214
|
+
path = Path(".claude/sweep-accuracy-state.csv")
|
|
215
|
+
header = ["module", "last_inspected", "issue", "severity_max",
|
|
216
|
+
"categories_found", "notes"]
|
|
217
|
+
|
|
218
|
+
rows = {}
|
|
219
|
+
if path.exists():
|
|
220
|
+
with path.open() as f:
|
|
221
|
+
for r in csv.DictReader(f):
|
|
222
|
+
rows[r["module"]] = r # last write wins on dupes
|
|
223
|
+
|
|
224
|
+
rows["{module}"] = {
|
|
225
|
+
"module": "{module}",
|
|
226
|
+
"last_inspected": "<today's ISO date, e.g. 2026-04-27>",
|
|
227
|
+
"issue": "<issue number from rockout, or empty string>",
|
|
228
|
+
"severity_max": "<HIGH|MEDIUM|LOW, or empty>",
|
|
229
|
+
"categories_found": "<semicolon-joined ints, e.g. 1;3, or empty>",
|
|
230
|
+
"notes": "<single-line notes (replace any newlines with spaces), or empty>",
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
with path.open("w", newline="") as f:
|
|
234
|
+
w = csv.DictWriter(f, fieldnames=header, quoting=csv.QUOTE_MINIMAL)
|
|
235
|
+
w.writeheader()
|
|
236
|
+
for m in sorted(rows):
|
|
237
|
+
w.writerow(rows[m])
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Use empty strings (not `null`) for missing values. Set `issue` to the
|
|
241
|
+
issue number when one was filed, otherwise leave it empty.
|
|
242
|
+
|
|
243
|
+
Then `git add .claude/sweep-accuracy-state.csv` and commit it to the
|
|
207
244
|
worktree branch so the state update is included in the PR.
|
|
208
245
|
|
|
209
246
|
Important:
|
|
@@ -236,7 +273,7 @@ State is updated by the subagents themselves (see agent prompt step 5).
|
|
|
236
273
|
After completion, verify state with:
|
|
237
274
|
|
|
238
275
|
```
|
|
239
|
-
|
|
276
|
+
column -t -s, .claude/sweep-accuracy-state.csv | less
|
|
240
277
|
```
|
|
241
278
|
|
|
242
279
|
To reset all tracking: `/sweep-accuracy --reset-state`
|
|
@@ -248,8 +285,10 @@ To reset all tracking: `/sweep-accuracy --reset-state`
|
|
|
248
285
|
- Do NOT modify any source files directly. Subagents handle fixes via /rockout.
|
|
249
286
|
- Keep the output concise -- the table and agent dispatch are the deliverables.
|
|
250
287
|
- If $ARGUMENTS is empty, use defaults: top 3, no category filter, no exclusions.
|
|
251
|
-
- State file (`.claude/sweep-accuracy-state.
|
|
252
|
-
|
|
288
|
+
- State file (`.claude/sweep-accuracy-state.csv`) is tracked in git, with
|
|
289
|
+
`merge=union` set in `.gitattributes` so parallel sweeps touching
|
|
290
|
+
different modules auto-merge. Subagents must `git add` and commit it so
|
|
291
|
+
the state update lands in the PR.
|
|
253
292
|
- For subpackage modules (geotiff, reproject, hydro), the subagent should read
|
|
254
293
|
ALL `.py` files in the subpackage directory, not just `__init__.py`.
|
|
255
294
|
- Only flag patterns that are ACTUALLY present in the code. Do not report
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# API Consistency Sweep: Dispatch subagents to audit parameter naming and signature drift
|
|
2
|
+
|
|
3
|
+
Audit xrspatial modules for API consistency issues across analogous public
|
|
4
|
+
functions: parameter naming drift (`cellsize` vs `cell_size` vs `res`,
|
|
5
|
+
`agg` vs `raster` vs `data`), inconsistent return-type shapes, missing or
|
|
6
|
+
mismatched type hints, docstring/signature divergence. Cheap to find; makes
|
|
7
|
+
the library feel polished and predictable. Subagents fix CRITICAL, HIGH,
|
|
8
|
+
and MEDIUM findings via /rockout — but flag deprecation impact in the
|
|
9
|
+
issue since renames are breaking changes.
|
|
10
|
+
|
|
11
|
+
Optional arguments: $ARGUMENTS
|
|
12
|
+
(e.g. `--top 3`, `--exclude slope,aspect`, `--only-terrain`, `--reset-state`)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Step 1 -- Gather module metadata via git
|
|
17
|
+
|
|
18
|
+
Enumerate candidate modules:
|
|
19
|
+
|
|
20
|
+
**Single-file modules:** Every `.py` file directly under `xrspatial/`, excluding
|
|
21
|
+
`__init__.py`, `_version.py`, `__main__.py`, `utils.py`, `accessor.py`,
|
|
22
|
+
`preview.py`, `dataset_support.py`, `diagnostics.py`, `analytics.py`.
|
|
23
|
+
|
|
24
|
+
**Subpackage modules:** `geotiff/`, `reproject/`, and `hydro/` directories under
|
|
25
|
+
`xrspatial/`. Treat each as a single audit unit.
|
|
26
|
+
|
|
27
|
+
For every module, collect:
|
|
28
|
+
|
|
29
|
+
| Field | How |
|
|
30
|
+
|-------|-----|
|
|
31
|
+
| **last_modified** | `git log -1 --format=%aI -- <path>` |
|
|
32
|
+
| **total_commits** | `git log --oneline -- <path> \| wc -l` |
|
|
33
|
+
| **loc** | `wc -l < <path>` |
|
|
34
|
+
| **public_funcs** | count of functions at module level (heuristic: `^def [a-z]`) |
|
|
35
|
+
|
|
36
|
+
Store results in memory -- do NOT write intermediate files.
|
|
37
|
+
|
|
38
|
+
## Step 2 -- Load inspection state
|
|
39
|
+
|
|
40
|
+
Read `.claude/sweep-api-consistency-state.csv`.
|
|
41
|
+
|
|
42
|
+
If it does not exist, treat every module as never-inspected. If
|
|
43
|
+
`$ARGUMENTS` contains `--reset-state`, delete the file first.
|
|
44
|
+
|
|
45
|
+
State file schema (one row per module):
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
module,last_inspected,issue,severity_max,categories_found,notes
|
|
49
|
+
slope,2026-05-01,1042,HIGH,1;3,"optional single-line notes"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The file is registered with `merge=union` in `.gitattributes`.
|
|
53
|
+
|
|
54
|
+
## Step 3 -- Score each module
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
days_since_inspected = (today - last_inspected).days # 9999 if never
|
|
58
|
+
days_since_modified = (today - last_modified).days
|
|
59
|
+
|
|
60
|
+
score = (days_since_inspected * 3)
|
|
61
|
+
+ (public_funcs * 8)
|
|
62
|
+
+ (total_commits * 0.3)
|
|
63
|
+
- (days_since_modified * 0.1)
|
|
64
|
+
+ (loc * 0.03)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Rationale:
|
|
68
|
+
- Public function count weighted heavily — consistency issues are
|
|
69
|
+
cross-function comparisons, so more functions = more comparison surface
|
|
70
|
+
- Modules never inspected dominate
|
|
71
|
+
- Recently modified slightly deprioritized
|
|
72
|
+
|
|
73
|
+
## Step 4 -- Apply filters from $ARGUMENTS
|
|
74
|
+
|
|
75
|
+
Same filter set as other sweeps: `--top N`, `--exclude`, `--only-terrain`,
|
|
76
|
+
`--only-focal`, `--only-hydro`, `--only-io`, `--reset-state`.
|
|
77
|
+
|
|
78
|
+
## Step 5 -- Print the ranked table and launch subagents
|
|
79
|
+
|
|
80
|
+
### 5a. Print the ranked table
|
|
81
|
+
|
|
82
|
+
Print a markdown table showing ALL scored modules sorted by score descending.
|
|
83
|
+
|
|
84
|
+
### 5b. Launch subagents for the top N modules
|
|
85
|
+
|
|
86
|
+
For each of the top N modules (default 3), launch an Agent in parallel using
|
|
87
|
+
`isolation: "worktree"` and `mode: "auto"`. All N agents must be dispatched
|
|
88
|
+
in a single message so they run concurrently.
|
|
89
|
+
|
|
90
|
+
Each agent's prompt must be self-contained:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
You are auditing the xrspatial module "{module}" for API consistency issues.
|
|
94
|
+
|
|
95
|
+
This module has {commits} commits and {loc} lines of code.
|
|
96
|
+
|
|
97
|
+
Read these files: {module_files}
|
|
98
|
+
|
|
99
|
+
Also read xrspatial/__init__.py to see what is publicly re-exported, and
|
|
100
|
+
xrspatial/utils.py for shared helpers.
|
|
101
|
+
|
|
102
|
+
For comparison, read 2-3 sibling modules (analogous functions). Examples:
|
|
103
|
+
- For aspect: also read slope.py and curvature.py
|
|
104
|
+
- For erosion: also read morphology.py
|
|
105
|
+
- For glcm: also read focal.py and convolution.py
|
|
106
|
+
The point is to compare parameter naming and return shapes against
|
|
107
|
+
modules with similar function families.
|
|
108
|
+
|
|
109
|
+
**Your task:**
|
|
110
|
+
|
|
111
|
+
1. Read all listed files thoroughly. For each public function, build a
|
|
112
|
+
small mental table of (function name, signature, return type).
|
|
113
|
+
|
|
114
|
+
2. Audit for these 5 API-consistency categories. Only flag issues ACTUALLY
|
|
115
|
+
present.
|
|
116
|
+
|
|
117
|
+
**Cat 1 — Parameter naming drift**
|
|
118
|
+
- HIGH: same concept named differently across analogous public
|
|
119
|
+
functions in this module or in sibling modules. Common offenders:
|
|
120
|
+
`cellsize` vs `cell_size` vs `res` vs `resolution`
|
|
121
|
+
`agg` vs `raster` vs `data` vs `array`
|
|
122
|
+
`x` vs `xs` vs `x_coords`
|
|
123
|
+
`nodata` vs `_FillValue` vs `nodata_value`
|
|
124
|
+
`cmap` vs `color_map` vs `colormap`
|
|
125
|
+
`kernel` vs `weights` vs `mask`
|
|
126
|
+
- MEDIUM: same concept named consistently inside this module but
|
|
127
|
+
different from sibling modules
|
|
128
|
+
- MEDIUM: positional-vs-keyword convention drift (sibling functions
|
|
129
|
+
accept the same arg, one as positional, one as keyword-only)
|
|
130
|
+
Severity: HIGH if both names exist in the public API at the same time
|
|
131
|
+
(real user-facing inconsistency); MEDIUM otherwise
|
|
132
|
+
|
|
133
|
+
**Cat 2 — Return shape drift**
|
|
134
|
+
- HIGH: analogous functions return different types (one returns
|
|
135
|
+
DataArray, sibling returns Dataset for the same conceptual op)
|
|
136
|
+
- HIGH: tuple-return vs single-return drift (one function returns
|
|
137
|
+
`(slope, aspect)`, analog returns `slope` only — caller cannot
|
|
138
|
+
interchange)
|
|
139
|
+
- MEDIUM: result coord/attr conventions differ (one function emits
|
|
140
|
+
`attrs['units']`, sibling does not)
|
|
141
|
+
- MEDIUM: in-place vs returned-copy semantics drift
|
|
142
|
+
Severity: HIGH if it breaks substitutability between sibling functions
|
|
143
|
+
|
|
144
|
+
**Cat 3 — Type hints and docstrings**
|
|
145
|
+
- MEDIUM: missing type hints on a public function while sibling
|
|
146
|
+
functions in this module have them
|
|
147
|
+
- MEDIUM: type hint says `xr.DataArray` but the docstring example
|
|
148
|
+
passes a numpy array (or vice versa) — docs/types disagree
|
|
149
|
+
- MEDIUM: docstring lists a parameter that does not exist in the
|
|
150
|
+
signature (or omits one that does)
|
|
151
|
+
- MEDIUM: docstring says "Returns: DataArray" but the function returns
|
|
152
|
+
a tuple
|
|
153
|
+
- LOW: docstring style drift (numpy-style vs google-style mix)
|
|
154
|
+
Severity: MEDIUM (these are documentation bugs that mislead users)
|
|
155
|
+
|
|
156
|
+
**Cat 4 — Default value inconsistency**
|
|
157
|
+
- HIGH: same parameter has different defaults in analogous functions
|
|
158
|
+
(e.g. `kernel_size=3` in one function, `kernel_size=5` in sibling,
|
|
159
|
+
no documented reason)
|
|
160
|
+
- MEDIUM: default uses a mutable type (`def f(x=[])`) — Python anti-pattern
|
|
161
|
+
- MEDIUM: default `None` plus internal substitution where a literal
|
|
162
|
+
default would be clearer and equally correct
|
|
163
|
+
Severity: HIGH if user-surprise is likely (silent behavior change
|
|
164
|
+
when switching between sibling functions)
|
|
165
|
+
|
|
166
|
+
**Cat 5 — Public API surface drift**
|
|
167
|
+
- HIGH: function is called by tests and notebooks but is not in
|
|
168
|
+
`xrspatial/__init__.py` or in the module's `__all__` (orphan API)
|
|
169
|
+
- HIGH: function in `__all__` but undocumented in the docstring
|
|
170
|
+
- MEDIUM: deprecated alias still exported with no `DeprecationWarning`
|
|
171
|
+
- MEDIUM: private-looking name (`_foo`) but is referenced in tests as
|
|
172
|
+
if public
|
|
173
|
+
- LOW: `from .module import *` patterns that bring inconsistent
|
|
174
|
+
symbols into the public namespace
|
|
175
|
+
Severity: HIGH for orphan APIs (users find them, depend on them, then
|
|
176
|
+
break when they vanish)
|
|
177
|
+
|
|
178
|
+
3. For each real issue, assign severity + file:line.
|
|
179
|
+
|
|
180
|
+
4. If any CRITICAL, HIGH, or MEDIUM issue is found, run /rockout to fix it.
|
|
181
|
+
IMPORTANT: parameter renames are breaking changes — for HIGH
|
|
182
|
+
parameter-rename fixes, the rockout PR must add a deprecation
|
|
183
|
+
shim (accept both old and new names; emit DeprecationWarning on the
|
|
184
|
+
old name; update docs). Document this in the issue body. For LOW
|
|
185
|
+
issues, document but do not fix.
|
|
186
|
+
|
|
187
|
+
5. Update .claude/sweep-api-consistency-state.csv using csv.DictReader/Writer:
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
import csv
|
|
191
|
+
from pathlib import Path
|
|
192
|
+
|
|
193
|
+
path = Path(".claude/sweep-api-consistency-state.csv")
|
|
194
|
+
header = ["module", "last_inspected", "issue", "severity_max",
|
|
195
|
+
"categories_found", "notes"]
|
|
196
|
+
|
|
197
|
+
rows = {}
|
|
198
|
+
if path.exists():
|
|
199
|
+
with path.open() as f:
|
|
200
|
+
for r in csv.DictReader(f):
|
|
201
|
+
rows[r["module"]] = r
|
|
202
|
+
|
|
203
|
+
rows["{module}"] = {
|
|
204
|
+
"module": "{module}",
|
|
205
|
+
"last_inspected": "<today's ISO date>",
|
|
206
|
+
"issue": "<issue number or empty>",
|
|
207
|
+
"severity_max": "<HIGH|MEDIUM|LOW or empty>",
|
|
208
|
+
"categories_found": "<semicolon-joined ints or empty>",
|
|
209
|
+
"notes": "<single-line notes or empty>",
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
with path.open("w", newline="") as f:
|
|
213
|
+
w = csv.DictWriter(f, fieldnames=header, quoting=csv.QUOTE_MINIMAL)
|
|
214
|
+
w.writeheader()
|
|
215
|
+
for m in sorted(rows):
|
|
216
|
+
w.writerow(rows[m])
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Then `git add` and commit.
|
|
220
|
+
|
|
221
|
+
Important:
|
|
222
|
+
- Only flag real consistency issues. The lib has 40+ modules — do not
|
|
223
|
+
list every minor naming difference; focus on user-facing surprise.
|
|
224
|
+
- Compare against 2-3 sibling modules. Cross-cutting concerns (e.g.
|
|
225
|
+
cellsize naming convention) often span the whole library; if a rename
|
|
226
|
+
is safe in one module but breaks 20 others, surface that as a notes
|
|
227
|
+
comment, do not file a per-module issue.
|
|
228
|
+
- For the hydro subpackage: pick one variant (d8) and check whether
|
|
229
|
+
dinf/mfd siblings agree.
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### 5c. Print a status line
|
|
233
|
+
|
|
234
|
+
After dispatching, print:
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
Launched {N} API consistency audit agents: {module1}, {module2}, {module3}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Step 6 -- State updates
|
|
241
|
+
|
|
242
|
+
To reset: `/sweep-api-consistency --reset-state`
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## General Rules
|
|
247
|
+
|
|
248
|
+
- Do NOT modify any source files directly. Subagents handle fixes.
|
|
249
|
+
- Keep the output concise.
|
|
250
|
+
- If $ARGUMENTS is empty, use defaults: top 3, no category filter, no
|
|
251
|
+
exclusions.
|
|
252
|
+
- State file (`.claude/sweep-api-consistency-state.csv`) is tracked in
|
|
253
|
+
git with `merge=union`.
|
|
254
|
+
- Renames are breaking. The fix path is a deprecation shim, not a
|
|
255
|
+
hard rename, unless the function has a clearly orphan/private status.
|
|
256
|
+
- False positives are worse than missed issues.
|