@oddessentials/repo-standards 1.2.1 → 2.0.1

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.
@@ -118,6 +118,12 @@
118
118
  "label": "Linting",
119
119
  "stackHints": {
120
120
  "csharp-dotnet": {
121
+ "bazelHints": {
122
+ "commands": [
123
+ "bazel build //... --aspects=@rules_dotnet//dotnet:analyzers.bzl%analyzer_aspect"
124
+ ],
125
+ "notes": "Example only; actual targets are repo-defined. Use rules_dotnet analyzer aspects for Roslyn-based linting."
126
+ },
121
127
  "exampleConfigFiles": [
122
128
  ".editorconfig",
123
129
  "Directory.Build.props"
@@ -133,12 +139,15 @@
133
139
  "requiredFiles": [
134
140
  ".editorconfig"
135
141
  ],
136
- "requiredScripts": [
137
- "lint"
138
- ],
139
142
  "verification": ".editorconfig must exist to drive the .NET formatting and analysis tooling."
140
143
  },
141
144
  "go": {
145
+ "bazelHints": {
146
+ "commands": [
147
+ "bazel test //... --@io_bazel_rules_go//go/config:nogo=@//:nogo"
148
+ ],
149
+ "notes": "Use nogo for static analysis via rules_go. Configure nogo target with desired analyzers."
150
+ },
142
151
  "exampleConfigFiles": [
143
152
  ".golangci.yml",
144
153
  ".golangci.yaml"
@@ -158,28 +167,39 @@
158
167
  "verification": ".golangci.yml or .golangci.yaml indicates linting is configured. Run 'golangci-lint run' to verify."
159
168
  },
160
169
  "python": {
170
+ "anyOfFiles": [
171
+ "pyproject.toml",
172
+ "ruff.toml",
173
+ ".flake8",
174
+ "setup.cfg",
175
+ "tox.ini"
176
+ ],
177
+ "bazelHints": {
178
+ "commands": [
179
+ "bazel test //...:ruff_test",
180
+ "bazel run //tools/lint:ruff -- check ."
181
+ ],
182
+ "notes": "Example only; actual targets are repo-defined. Use rules_python with ruff wrapped as py_test or run target."
183
+ },
161
184
  "exampleConfigFiles": [
162
185
  "pyproject.toml",
163
- ".flake8"
186
+ ".flake8",
187
+ "ruff.toml"
164
188
  ],
165
189
  "exampleTools": [
166
190
  "ruff",
167
191
  "flake8"
168
192
  ],
169
193
  "notes": "Configure a primary linter (such as ruff) and keep rules focused on catching real issues without overwhelming developers.",
170
- "optionalFiles": [
171
- "ruff.toml",
172
- ".flake8"
173
- ],
174
- "requiredFiles": [
175
- "pyproject.toml"
176
- ],
177
- "requiredScripts": [
178
- "lint"
179
- ],
180
- "verification": "pyproject.toml (or ruff.toml / .flake8) signals that linting tools are configured for the repository."
194
+ "verification": "pyproject.toml (or ruff.toml / .flake8 / setup.cfg) signals that linting tools are configured for the repository."
181
195
  },
182
196
  "rust": {
197
+ "bazelHints": {
198
+ "commands": [
199
+ "bazel build //... --aspects=@rules_rust//rust:defs.bzl%clippy_aspect --output_groups=clippy_checks"
200
+ ],
201
+ "notes": "Example only; actual targets are repo-defined. rules_rust includes clippy_aspect for Bazel-native Clippy linting."
202
+ },
183
203
  "exampleConfigFiles": [
184
204
  "clippy.toml",
185
205
  ".clippy.toml"
@@ -199,27 +219,40 @@
199
219
  "verification": "Clippy is available via rustup component. Run 'cargo clippy' to verify linting is configured."
200
220
  },
201
221
  "typescript-js": {
222
+ "anyOfFiles": [
223
+ "eslint.config.js",
224
+ "eslint.config.mjs",
225
+ "eslint.config.cjs",
226
+ ".eslintrc.js",
227
+ ".eslintrc.cjs",
228
+ ".eslintrc.json",
229
+ ".eslintrc.yaml",
230
+ ".eslintrc.yml"
231
+ ],
232
+ "bazelHints": {
233
+ "commands": [
234
+ "bazel test //... --aspects=//tools:lint.bzl%eslint_aspect --output_groups=report"
235
+ ],
236
+ "notes": "Example only; actual targets are repo-defined. Wrap eslint via aspect_rules_lint or a custom sh_test rule.",
237
+ "recommendedTargets": [
238
+ "//tools/lint:lint"
239
+ ]
240
+ },
202
241
  "exampleConfigFiles": [
203
- ".eslintrc.*"
242
+ ".eslintrc.*",
243
+ "eslint.config.js"
204
244
  ],
205
245
  "exampleTools": [
206
246
  "eslint"
207
247
  ],
208
248
  "notes": "Treat new lint errors as CI failures; keep existing issues as warnings until addressed.",
209
249
  "optionalFiles": [
210
- ".eslintrc.js",
211
- ".eslintrc.cjs",
212
- ".eslintrc.json",
213
- ".eslintrc.yaml",
214
250
  ".prettierrc",
215
251
  "prettier.config.js",
216
252
  "prettier.config.cjs",
217
253
  "prettier.config.json",
218
254
  "prettier.config.yaml"
219
255
  ],
220
- "requiredFiles": [
221
- "eslint.config.js"
222
- ],
223
256
  "requiredScripts": [
224
257
  "lint"
225
258
  ],
@@ -250,6 +283,12 @@
250
283
  "label": "Unit Test Runner",
251
284
  "stackHints": {
252
285
  "csharp-dotnet": {
286
+ "bazelHints": {
287
+ "commands": [
288
+ "bazel test //..."
289
+ ],
290
+ "notes": "Use rules_dotnet to define test targets for xUnit/NUnit/MSTest projects."
291
+ },
253
292
  "exampleConfigFiles": [
254
293
  "*.Tests.csproj"
255
294
  ],
@@ -265,6 +304,12 @@
265
304
  "verification": "Test projects are present in the solution; test configuration is defined."
266
305
  },
267
306
  "go": {
307
+ "bazelHints": {
308
+ "commands": [
309
+ "bazel test //..."
310
+ ],
311
+ "notes": "rules_go go_test targets wrap 'go test' with Bazel's caching and hermeticity."
312
+ },
268
313
  "exampleConfigFiles": [
269
314
  "go.mod"
270
315
  ],
@@ -279,6 +324,12 @@
279
324
  "verification": "Run 'go test ./...' to verify the test suite is configured and passing."
280
325
  },
281
326
  "python": {
327
+ "bazelHints": {
328
+ "commands": [
329
+ "bazel test //..."
330
+ ],
331
+ "notes": "Example only; actual targets are repo-defined. Use rules_python py_test for pytest-based tests."
332
+ },
282
333
  "exampleConfigFiles": [
283
334
  "pytest.ini",
284
335
  "pyproject.toml"
@@ -292,12 +343,15 @@
292
343
  "pyproject.toml",
293
344
  "tests/"
294
345
  ],
295
- "requiredScripts": [
296
- "test"
297
- ],
298
346
  "verification": "Test framework configuration is present; tests/ directory or pytest configuration exists."
299
347
  },
300
348
  "rust": {
349
+ "bazelHints": {
350
+ "commands": [
351
+ "bazel test //..."
352
+ ],
353
+ "notes": "rules_rust rust_test targets run cargo test under Bazel's hermetic environment."
354
+ },
301
355
  "exampleConfigFiles": [
302
356
  "Cargo.toml"
303
357
  ],
@@ -314,6 +368,12 @@
314
368
  "verification": "Run 'cargo test' to verify the test suite is configured and passing."
315
369
  },
316
370
  "typescript-js": {
371
+ "bazelHints": {
372
+ "commands": [
373
+ "bazel test //..."
374
+ ],
375
+ "notes": "Bazel discovers and runs all test targets. Use rules_js for Jest/Vitest integration."
376
+ },
317
377
  "exampleConfigFiles": [
318
378
  "jest.config.*"
319
379
  ],
@@ -625,6 +685,12 @@
625
685
  "label": "Unit Test Reporter / Coverage",
626
686
  "stackHints": {
627
687
  "csharp-dotnet": {
688
+ "bazelHints": {
689
+ "commands": [
690
+ "bazel coverage //..."
691
+ ],
692
+ "notes": "Use rules_dotnet with coverage instrumentation enabled."
693
+ },
628
694
  "exampleConfigFiles": [
629
695
  "*.csproj"
630
696
  ],
@@ -636,6 +702,12 @@
636
702
  "verification": "Run the test suite with coverage enabled (for example, using coverlet or a similar tool) and verify that coverage reports are generated and used in CI to monitor thresholds."
637
703
  },
638
704
  "go": {
705
+ "bazelHints": {
706
+ "commands": [
707
+ "bazel coverage //..."
708
+ ],
709
+ "notes": "rules_go supports coverage via bazel coverage. Use --combined_report=lcov for aggregated output."
710
+ },
639
711
  "exampleConfigFiles": [
640
712
  "go.mod"
641
713
  ],
@@ -647,6 +719,12 @@
647
719
  "verification": "Run 'go test -cover ./...' and verify coverage reports are produced and thresholds monitored."
648
720
  },
649
721
  "python": {
722
+ "bazelHints": {
723
+ "commands": [
724
+ "bazel coverage //..."
725
+ ],
726
+ "notes": "Use rules_python py_test with coverage instrumentation. Combine with --combined_report=lcov."
727
+ },
650
728
  "exampleConfigFiles": [
651
729
  "pytest.ini",
652
730
  "pyproject.toml"
@@ -660,6 +738,12 @@
660
738
  "verification": "Run the unit tests with coverage (for example, pytest with pytest-cov) and confirm that coverage reports are generated and referenced in CI to enforce or track thresholds."
661
739
  },
662
740
  "rust": {
741
+ "bazelHints": {
742
+ "commands": [
743
+ "bazel coverage //..."
744
+ ],
745
+ "notes": "Bazel coverage with rules_rust requires LLVM instrumentation. May need additional toolchain configuration."
746
+ },
663
747
  "exampleConfigFiles": [
664
748
  "Cargo.toml"
665
749
  ],
@@ -672,6 +756,12 @@
672
756
  "verification": "Run 'cargo tarpaulin' or equivalent and verify coverage reports are generated and thresholds enforced."
673
757
  },
674
758
  "typescript-js": {
759
+ "bazelHints": {
760
+ "commands": [
761
+ "bazel coverage //..."
762
+ ],
763
+ "notes": "Bazel coverage collects coverage data from all test targets. Use --combined_report=lcov for aggregated reports."
764
+ },
675
765
  "exampleConfigFiles": [
676
766
  "jest.config.*"
677
767
  ],
@@ -707,6 +797,13 @@
707
797
  "label": "CI Quality Gates",
708
798
  "stackHints": {
709
799
  "csharp-dotnet": {
800
+ "bazelHints": {
801
+ "commands": [
802
+ "bazel build //...",
803
+ "bazel test //..."
804
+ ],
805
+ "notes": "Bazel handles all analysis, testing, and packaging via defined targets."
806
+ },
710
807
  "exampleConfigFiles": [
711
808
  ".github/workflows/*",
712
809
  "azure-pipelines.yml"
@@ -716,6 +813,13 @@
716
813
  "verification": "Open the CI configuration and verify there is a job or stage that runs analyzers, tests, build, and any required packaging or container checks before merging to main."
717
814
  },
718
815
  "go": {
816
+ "bazelHints": {
817
+ "commands": [
818
+ "bazel build //...",
819
+ "bazel test //..."
820
+ ],
821
+ "notes": "rules_go go_binary and go_test targets provide hermetic builds and tests."
822
+ },
719
823
  "exampleConfigFiles": [
720
824
  ".github/workflows/*",
721
825
  "azure-pipelines.yml"
@@ -725,6 +829,13 @@
725
829
  "verification": "Verify CI runs golangci-lint, go test, and go build before merging to main."
726
830
  },
727
831
  "python": {
832
+ "bazelHints": {
833
+ "commands": [
834
+ "bazel build //...",
835
+ "bazel test //..."
836
+ ],
837
+ "notes": "Bazel py_binary and py_test targets replace traditional Python tooling."
838
+ },
728
839
  "exampleConfigFiles": [
729
840
  ".github/workflows/*",
730
841
  "azure-pipelines.yml"
@@ -734,6 +845,13 @@
734
845
  "verification": "Open the CI configuration and verify there is a job or stage that runs linting, type checking (if used), tests, and any packaging or container checks before merging to main."
735
846
  },
736
847
  "rust": {
848
+ "bazelHints": {
849
+ "commands": [
850
+ "bazel build //...",
851
+ "bazel test //..."
852
+ ],
853
+ "notes": "rules_rust provides rust_library, rust_test, and clippy_aspect for complete CI."
854
+ },
737
855
  "exampleConfigFiles": [
738
856
  ".github/workflows/*",
739
857
  "azure-pipelines.yml"
@@ -743,6 +861,13 @@
743
861
  "verification": "Verify CI runs cargo clippy, cargo test, and cargo build before merging to main."
744
862
  },
745
863
  "typescript-js": {
864
+ "bazelHints": {
865
+ "commands": [
866
+ "bazel build //...",
867
+ "bazel test //..."
868
+ ],
869
+ "notes": "Replace npm run ci with Bazel commands. All quality gates run as Bazel targets."
870
+ },
746
871
  "exampleConfigFiles": [
747
872
  ".github/workflows/*",
748
873
  "azure-pipelines.yml"
@@ -776,6 +901,12 @@
776
901
  "label": "Code Formatter",
777
902
  "stackHints": {
778
903
  "csharp-dotnet": {
904
+ "bazelHints": {
905
+ "commands": [
906
+ "bazel run //tools/format:dotnet_format -- --verify-no-changes"
907
+ ],
908
+ "notes": "Wrap dotnet format as a Bazel run target."
909
+ },
779
910
  "exampleConfigFiles": [
780
911
  ".editorconfig"
781
912
  ],
@@ -786,6 +917,12 @@
786
917
  "verification": "Run the configured formatter or code style enforcement (for example, `dotnet format`) and confirm that code in the repository conforms to the defined rules."
787
918
  },
788
919
  "go": {
920
+ "bazelHints": {
921
+ "commands": [
922
+ "bazel run @go_sdk//:bin/gofmt -- -d ."
923
+ ],
924
+ "notes": "Run gofmt via the Bazel-managed Go SDK for hermetic formatting checks."
925
+ },
789
926
  "exampleConfigFiles": [],
790
927
  "exampleTools": [
791
928
  "gofmt",
@@ -795,6 +932,12 @@
795
932
  "verification": "Run 'gofmt -d .' or 'goimports -d .' and confirm no output indicates clean formatting."
796
933
  },
797
934
  "python": {
935
+ "bazelHints": {
936
+ "commands": [
937
+ "bazel run //tools/format:black -- --check ."
938
+ ],
939
+ "notes": "Wrap black as a py_binary run target for format checking."
940
+ },
798
941
  "exampleConfigFiles": [
799
942
  "pyproject.toml"
800
943
  ],
@@ -805,6 +948,12 @@
805
948
  "verification": "Run the configured formatter (for example, `black .` or `black --check .`) and confirm it reports clean formatting on committed code and auto-fixes as expected locally."
806
949
  },
807
950
  "rust": {
951
+ "bazelHints": {
952
+ "commands": [
953
+ "bazel build //... --aspects=@rules_rust//rust:defs.bzl%rustfmt_aspect --output_groups=rustfmt_checks"
954
+ ],
955
+ "notes": "rules_rust includes rustfmt_aspect for Bazel-native format checking."
956
+ },
808
957
  "exampleConfigFiles": [
809
958
  "rustfmt.toml",
810
959
  ".rustfmt.toml"
@@ -816,6 +965,13 @@
816
965
  "verification": "Run 'cargo fmt --check' and confirm it reports clean formatting. Use 'cargo fmt' to auto-fix."
817
966
  },
818
967
  "typescript-js": {
968
+ "bazelHints": {
969
+ "commands": [
970
+ "bazel run //tools/format:check",
971
+ "bazel test //...:format_test"
972
+ ],
973
+ "notes": "Wrap Prettier as a run target for formatting checks. Use aspect_rules_lint for format aspects."
974
+ },
819
975
  "exampleConfigFiles": [
820
976
  ".prettierrc.*",
821
977
  ".prettierignore"
@@ -930,6 +1086,12 @@
930
1086
  "label": "Type Checking",
931
1087
  "stackHints": {
932
1088
  "csharp-dotnet": {
1089
+ "bazelHints": {
1090
+ "commands": [
1091
+ "bazel build //..."
1092
+ ],
1093
+ "notes": "Example only; actual targets are repo-defined. C# type errors surface during bazel build with rules_dotnet."
1094
+ },
933
1095
  "exampleConfigFiles": [
934
1096
  ".editorconfig",
935
1097
  "Directory.Build.props",
@@ -945,12 +1107,15 @@
945
1107
  "requiredFiles": [
946
1108
  ".editorconfig"
947
1109
  ],
948
- "requiredScripts": [
949
- "typecheck"
950
- ],
951
1110
  "verification": ".editorconfig must exist; Directory.Build.props is optional for shared build configuration."
952
1111
  },
953
1112
  "go": {
1113
+ "bazelHints": {
1114
+ "commands": [
1115
+ "bazel build //..."
1116
+ ],
1117
+ "notes": "Go type checking is inherent to compilation. bazel build with rules_go enforces type safety."
1118
+ },
954
1119
  "exampleConfigFiles": [
955
1120
  "go.mod"
956
1121
  ],
@@ -965,6 +1130,13 @@
965
1130
  "verification": "Run 'go build ./...' to verify type correctness. Use 'go vet ./...' for additional static analysis."
966
1131
  },
967
1132
  "python": {
1133
+ "bazelHints": {
1134
+ "commands": [
1135
+ "bazel test //...:mypy_test",
1136
+ "bazel run //tools/typecheck:mypy"
1137
+ ],
1138
+ "notes": "Example only; actual targets are repo-defined. Wrap mypy as a py_test or run target."
1139
+ },
968
1140
  "exampleConfigFiles": [
969
1141
  "mypy.ini",
970
1142
  "pyproject.toml"
@@ -979,12 +1151,15 @@
979
1151
  "requiredFiles": [
980
1152
  "pyproject.toml"
981
1153
  ],
982
- "requiredScripts": [
983
- "typecheck"
984
- ],
985
1154
  "verification": "pyproject.toml (or mypy.ini) signals that mypy configuration is available for the repository."
986
1155
  },
987
1156
  "rust": {
1157
+ "bazelHints": {
1158
+ "commands": [
1159
+ "bazel build //..."
1160
+ ],
1161
+ "notes": "Rust type checking is inherent to compilation. bazel build with rules_rust enforces type safety."
1162
+ },
988
1163
  "exampleConfigFiles": [
989
1164
  "Cargo.toml"
990
1165
  ],
@@ -998,6 +1173,12 @@
998
1173
  "verification": "Run 'cargo check' or 'cargo build' to verify type correctness. All Rust code is type-checked by default."
999
1174
  },
1000
1175
  "typescript-js": {
1176
+ "bazelHints": {
1177
+ "commands": [
1178
+ "bazel build //..."
1179
+ ],
1180
+ "notes": "TypeScript type errors surface during bazel build with rules_ts. No separate typecheck step needed."
1181
+ },
1001
1182
  "exampleConfigFiles": [
1002
1183
  "tsconfig.json"
1003
1184
  ],
@@ -2043,6 +2224,43 @@
2043
2224
  "github-actions"
2044
2225
  ],
2045
2226
  "meta": {
2227
+ "bazelIntegration": {
2228
+ "advisoryNotice": "bazelHints are suggestions, not required execution paths. Consumers should prefer stack-native commands unless explicitly adopting Bazel.",
2229
+ "ciContract": {
2230
+ "configFlag": "--config=ci (define in .bazelrc)",
2231
+ "deterministicFlags": [
2232
+ "--nokeep_going",
2233
+ "--test_output=errors"
2234
+ ],
2235
+ "remoteCache": "Optional; not required for CI",
2236
+ "versionPinning": "Use .bazelversion file for Bazelisk"
2237
+ },
2238
+ "description": "Bazel build executor support for quality checks. All hints are ADVISORY—stack-native commands remain the default execution path.",
2239
+ "detectionRules": {
2240
+ "notes": "Detection uses repo-root markers only. Nested BUILD files do not trigger Bazel mode.",
2241
+ "optionalMarkers": [
2242
+ ".bazelrc",
2243
+ ".bazelversion"
2244
+ ],
2245
+ "rootMarkers": [
2246
+ "MODULE.bazel",
2247
+ "WORKSPACE.bazel",
2248
+ "WORKSPACE"
2249
+ ]
2250
+ },
2251
+ "optOut": {
2252
+ "configPath": "meta.bazelIntegration.enabled",
2253
+ "description": "Set meta.bazelIntegration.enabled = false in repo config to disable Bazel hints"
2254
+ },
2255
+ "targetConventions": {
2256
+ "build": "bazel build //...",
2257
+ "coverage": "bazel coverage //...",
2258
+ "description": "Recommended target naming (not assumed to exist). These are illustrative patterns; actual targets are repo-defined.",
2259
+ "format": "bazel run //tools/format:check",
2260
+ "lint": "//tools/lint:lint or bazel test //... with lint aspects",
2261
+ "test": "bazel test //..."
2262
+ }
2263
+ },
2046
2264
  "complexityChecks": {
2047
2265
  "description": "When supported by the stack, run cyclomatic complexity or similar metrics in CI as a warning-only check initially.",
2048
2266
  "enabledByDefault": true
@@ -35,26 +35,31 @@
35
35
  "id": "linting",
36
36
  "label": "Linting",
37
37
  "stack": {
38
+ "anyOfFiles": [
39
+ "pyproject.toml",
40
+ "ruff.toml",
41
+ ".flake8",
42
+ "setup.cfg",
43
+ "tox.ini"
44
+ ],
45
+ "bazelHints": {
46
+ "commands": [
47
+ "bazel test //...:ruff_test",
48
+ "bazel run //tools/lint:ruff -- check ."
49
+ ],
50
+ "notes": "Example only; actual targets are repo-defined. Use rules_python with ruff wrapped as py_test or run target."
51
+ },
38
52
  "exampleConfigFiles": [
39
53
  "pyproject.toml",
40
- ".flake8"
54
+ ".flake8",
55
+ "ruff.toml"
41
56
  ],
42
57
  "exampleTools": [
43
58
  "ruff",
44
59
  "flake8"
45
60
  ],
46
61
  "notes": "Configure a primary linter (such as ruff) and keep rules focused on catching real issues without overwhelming developers.",
47
- "optionalFiles": [
48
- "ruff.toml",
49
- ".flake8"
50
- ],
51
- "requiredFiles": [
52
- "pyproject.toml"
53
- ],
54
- "requiredScripts": [
55
- "lint"
56
- ],
57
- "verification": "pyproject.toml (or ruff.toml / .flake8) signals that linting tools are configured for the repository."
62
+ "verification": "pyproject.toml (or ruff.toml / .flake8 / setup.cfg) signals that linting tools are configured for the repository."
58
63
  }
59
64
  },
60
65
  {
@@ -67,6 +72,12 @@
67
72
  "id": "unit-test-runner",
68
73
  "label": "Unit Test Runner",
69
74
  "stack": {
75
+ "bazelHints": {
76
+ "commands": [
77
+ "bazel test //..."
78
+ ],
79
+ "notes": "Example only; actual targets are repo-defined. Use rules_python py_test for pytest-based tests."
80
+ },
70
81
  "exampleConfigFiles": [
71
82
  "pytest.ini",
72
83
  "pyproject.toml"
@@ -80,9 +91,6 @@
80
91
  "pyproject.toml",
81
92
  "tests/"
82
93
  ],
83
- "requiredScripts": [
84
- "test"
85
- ],
86
94
  "verification": "Test framework configuration is present; tests/ directory or pytest configuration exists."
87
95
  }
88
96
  },
@@ -166,6 +174,12 @@
166
174
  "id": "unit-test-reporter",
167
175
  "label": "Unit Test Reporter / Coverage",
168
176
  "stack": {
177
+ "bazelHints": {
178
+ "commands": [
179
+ "bazel coverage //..."
180
+ ],
181
+ "notes": "Use rules_python py_test with coverage instrumentation. Combine with --combined_report=lcov."
182
+ },
169
183
  "exampleConfigFiles": [
170
184
  "pytest.ini",
171
185
  "pyproject.toml"
@@ -189,6 +203,13 @@
189
203
  "id": "ci-quality-gates",
190
204
  "label": "CI Quality Gates",
191
205
  "stack": {
206
+ "bazelHints": {
207
+ "commands": [
208
+ "bazel build //...",
209
+ "bazel test //..."
210
+ ],
211
+ "notes": "Bazel py_binary and py_test targets replace traditional Python tooling."
212
+ },
192
213
  "exampleConfigFiles": [
193
214
  ".github/workflows/*",
194
215
  "azure-pipelines.yml"
@@ -208,6 +229,12 @@
208
229
  "id": "code-formatter",
209
230
  "label": "Code Formatter",
210
231
  "stack": {
232
+ "bazelHints": {
233
+ "commands": [
234
+ "bazel run //tools/format:black -- --check ."
235
+ ],
236
+ "notes": "Wrap black as a py_binary run target for format checking."
237
+ },
211
238
  "exampleConfigFiles": [
212
239
  "pyproject.toml"
213
240
  ],
@@ -248,6 +275,13 @@
248
275
  "id": "type-checking",
249
276
  "label": "Type Checking",
250
277
  "stack": {
278
+ "bazelHints": {
279
+ "commands": [
280
+ "bazel test //...:mypy_test",
281
+ "bazel run //tools/typecheck:mypy"
282
+ ],
283
+ "notes": "Example only; actual targets are repo-defined. Wrap mypy as a py_test or run target."
284
+ },
251
285
  "exampleConfigFiles": [
252
286
  "mypy.ini",
253
287
  "pyproject.toml"
@@ -262,9 +296,6 @@
262
296
  "requiredFiles": [
263
297
  "pyproject.toml"
264
298
  ],
265
- "requiredScripts": [
266
- "typecheck"
267
- ],
268
299
  "verification": "pyproject.toml (or mypy.ini) signals that mypy configuration is available for the repository."
269
300
  }
270
301
  },
@@ -546,6 +577,43 @@
546
577
  "azure-devops"
547
578
  ],
548
579
  "meta": {
580
+ "bazelIntegration": {
581
+ "advisoryNotice": "bazelHints are suggestions, not required execution paths. Consumers should prefer stack-native commands unless explicitly adopting Bazel.",
582
+ "ciContract": {
583
+ "configFlag": "--config=ci (define in .bazelrc)",
584
+ "deterministicFlags": [
585
+ "--nokeep_going",
586
+ "--test_output=errors"
587
+ ],
588
+ "remoteCache": "Optional; not required for CI",
589
+ "versionPinning": "Use .bazelversion file for Bazelisk"
590
+ },
591
+ "description": "Bazel build executor support for quality checks. All hints are ADVISORY—stack-native commands remain the default execution path.",
592
+ "detectionRules": {
593
+ "notes": "Detection uses repo-root markers only. Nested BUILD files do not trigger Bazel mode.",
594
+ "optionalMarkers": [
595
+ ".bazelrc",
596
+ ".bazelversion"
597
+ ],
598
+ "rootMarkers": [
599
+ "MODULE.bazel",
600
+ "WORKSPACE.bazel",
601
+ "WORKSPACE"
602
+ ]
603
+ },
604
+ "optOut": {
605
+ "configPath": "meta.bazelIntegration.enabled",
606
+ "description": "Set meta.bazelIntegration.enabled = false in repo config to disable Bazel hints"
607
+ },
608
+ "targetConventions": {
609
+ "build": "bazel build //...",
610
+ "coverage": "bazel coverage //...",
611
+ "description": "Recommended target naming (not assumed to exist). These are illustrative patterns; actual targets are repo-defined.",
612
+ "format": "bazel run //tools/format:check",
613
+ "lint": "//tools/lint:lint or bazel test //... with lint aspects",
614
+ "test": "bazel test //..."
615
+ }
616
+ },
549
617
  "complexityChecks": {
550
618
  "description": "When supported by the stack, run cyclomatic complexity or similar metrics in CI as a warning-only check initially.",
551
619
  "enabledByDefault": true