@oddessentials/repo-standards 2.1.0 → 3.1.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.
@@ -125,7 +125,7 @@
125
125
  "stage": "release"
126
126
  }
127
127
  },
128
- "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history.",
128
+ "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history. Maintain a single canonical version source (for example, package.json or VERSION) that all release artifacts use.",
129
129
  "id": "semantic-versioning",
130
130
  "label": "Semantic Versioning",
131
131
  "stack": {
@@ -139,8 +139,49 @@
139
139
  "setuptools_scm",
140
140
  "towncrier"
141
141
  ],
142
- "notes": "Automate version bumping and changelog generation using setuptools_scm (git-tag based) or bumpversion with towncrier for changelog fragments. Configure CI to automatically update version in pyproject.toml, generate/update CHANGELOG.md from commit messages or changelog fragments, and create git tags. Maintain a single source of truth for versioning.",
143
- "verification": "Check that the package version in pyproject or setup configuration follows SemVer and verify that the configured tool (for example, setuptools_scm or bumpversion) automatically computes or bumps the version and generates changelog entries from commit history or fragments."
142
+ "notes": "Automate version bumping and changelog generation using setuptools_scm (git-tag based) or bumpversion with towncrier for changelog fragments. Keep pyproject.toml (or VERSION) as the single canonical version source, and have CI publish GitHub/PyPI/Docker artifacts from that same version.",
143
+ "optionalFiles": [
144
+ "VERSION",
145
+ "CHANGELOG.md"
146
+ ],
147
+ "requiredFiles": [
148
+ "pyproject.toml"
149
+ ],
150
+ "requiredScripts": [
151
+ "release"
152
+ ],
153
+ "verification": "Check that the canonical version in pyproject.toml or VERSION follows SemVer and verify that the configured tool (for example, setuptools_scm or bumpversion) computes or bumps the version and generates changelog entries from commit history or fragments."
154
+ }
155
+ },
156
+ {
157
+ "ciHints": {
158
+ "azure-devops": {
159
+ "stage": "release"
160
+ }
161
+ },
162
+ "description": "Use a single CI release pipeline that publishes all artifacts (GitHub releases, packages, containers) from the same canonical version source.",
163
+ "id": "unified-release-workflow",
164
+ "label": "Unified Release Workflow",
165
+ "stack": {
166
+ "exampleConfigFiles": [
167
+ ".github/workflows/release.yml",
168
+ "azure-pipelines.yml"
169
+ ],
170
+ "exampleTools": [
171
+ "setuptools_scm",
172
+ "twine",
173
+ "build",
174
+ "docker buildx"
175
+ ],
176
+ "notes": "Use a single release pipeline to publish PyPI packages, GitHub releases, and Docker images from the canonical version source (pyproject.toml or VERSION).",
177
+ "optionalFiles": [
178
+ "CHANGELOG.md",
179
+ "VERSION"
180
+ ],
181
+ "requiredScripts": [
182
+ "release"
183
+ ],
184
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
144
185
  }
145
186
  },
146
187
  {
@@ -149,10 +190,17 @@
149
190
  "stage": "quality"
150
191
  }
151
192
  },
152
- "description": "Enforce structured commit messages such as Conventional Commits.",
193
+ "description": "Enforce structured commit messages such as Conventional Commits via commit-msg hooks and CI. This is required for deterministic versioning and changelog generation.",
153
194
  "id": "commit-linting",
154
195
  "label": "Commit Linting",
155
196
  "stack": {
197
+ "anyOfFiles": [
198
+ ".cz.toml",
199
+ "commitlint.config.js",
200
+ "commitlint.config.cjs",
201
+ "commitlint.config.mjs",
202
+ "commitlint.config.json"
203
+ ],
156
204
  "exampleConfigFiles": [
157
205
  ".cz.toml",
158
206
  "pyproject.toml"
@@ -160,8 +208,11 @@
160
208
  "exampleTools": [
161
209
  "commitizen"
162
210
  ],
163
- "notes": "Standardize commit messages using commitizen or a similar helper and document the required types and scopes.",
164
- "verification": "Use the configured commit helper (for example, commitizen) or hooks to create a test commit and confirm that non-conforming messages are rejected while valid ones are accepted."
211
+ "notes": "Standardize Conventional Commits using commitizen or commitlint with commit-msg hooks plus CI so changelog generation is deterministic.",
212
+ "requiredScripts": [
213
+ "commitlint"
214
+ ],
215
+ "verification": "Use the configured commit helper or hooks to create a test commit and confirm that non-conforming messages are rejected locally and in CI."
165
216
  }
166
217
  },
167
218
  {
@@ -271,7 +322,7 @@
271
322
  "stage": "quality"
272
323
  }
273
324
  },
274
- "description": "Use static type checking to catch errors before runtime and enforce strictness on new code.",
325
+ "description": "Use static type checking to catch errors before runtime and enforce strictness on new code. For JS/TS stacks, require a TypeScript-first policy with strict mode and a CI typecheck step; allow JSDoc/checkJs migration for legacy JS.",
275
326
  "id": "type-checking",
276
327
  "label": "Type Checking",
277
328
  "stack": {
@@ -296,6 +347,9 @@
296
347
  "requiredFiles": [
297
348
  "pyproject.toml"
298
349
  ],
350
+ "requiredScripts": [
351
+ "typecheck"
352
+ ],
299
353
  "verification": "pyproject.toml (or mypy.ini) signals that mypy configuration is available for the repository."
300
354
  }
301
355
  },
@@ -327,6 +381,97 @@
327
381
  "verification": "Dependency lockfile is present; security scanning is configured in CI or project tooling."
328
382
  }
329
383
  },
384
+ {
385
+ "ciHints": {
386
+ "azure-devops": {
387
+ "stage": "build"
388
+ }
389
+ },
390
+ "description": "Ensure builds are reproducible by pinning dependencies, base images, and tool/runtime versions. Avoid network/time variance and fail when lockfiles drift.",
391
+ "id": "deterministic-builds",
392
+ "label": "Deterministic & Hermetic Builds",
393
+ "stack": {
394
+ "anyOfFiles": [
395
+ "requirements.txt",
396
+ "poetry.lock",
397
+ "Pipfile.lock"
398
+ ],
399
+ "exampleConfigFiles": [
400
+ "requirements.txt",
401
+ "poetry.lock",
402
+ "Pipfile.lock"
403
+ ],
404
+ "exampleTools": [
405
+ "pip-tools",
406
+ "poetry",
407
+ "uv"
408
+ ],
409
+ "notes": "Use pinned lockfiles (requirements.txt or poetry.lock) and pin Python version (.python-version or tool-versions). Avoid non-deterministic installs in CI.",
410
+ "optionalFiles": [
411
+ ".python-version",
412
+ ".tool-versions"
413
+ ],
414
+ "verification": "Lockfile is present and CI installs with pinned versions only. Python runtime is pinned."
415
+ }
416
+ },
417
+ {
418
+ "ciHints": {
419
+ "azure-devops": {
420
+ "stage": "security"
421
+ }
422
+ },
423
+ "description": "Produce SBOMs or provenance metadata, enable secret/code scanning, and sign tags or commits for critical repos.",
424
+ "id": "provenance-security",
425
+ "label": "Provenance & Security Metadata",
426
+ "stack": {
427
+ "exampleConfigFiles": [
428
+ ".github/workflows/codeql.yml",
429
+ ".github/workflows/provenance.yml"
430
+ ],
431
+ "exampleTools": [
432
+ "cyclonedx-python",
433
+ "syft",
434
+ "codeql",
435
+ "gitleaks",
436
+ "cosign"
437
+ ],
438
+ "notes": "Generate SBOM/provenance for PyPI and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
439
+ "optionalFiles": [
440
+ "SECURITY.md",
441
+ ".github/workflows/codeql.yml"
442
+ ],
443
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
444
+ }
445
+ },
446
+ {
447
+ "ciHints": {
448
+ "azure-devops": {
449
+ "stage": "ci"
450
+ }
451
+ },
452
+ "description": "Adopt standard CI templates and config samples to scale across repositories, minimizing bespoke pipeline logic.",
453
+ "id": "ci-templates-automation",
454
+ "label": "CI Templates & Automation",
455
+ "stack": {
456
+ "anyOfFiles": [
457
+ ".github/workflows/ci.yml",
458
+ "azure-pipelines.yml"
459
+ ],
460
+ "exampleConfigFiles": [
461
+ ".github/workflows/ci.yml",
462
+ "azure-pipelines.yml"
463
+ ],
464
+ "exampleTools": [
465
+ "GitHub Actions reusable workflows",
466
+ "Azure DevOps templates"
467
+ ],
468
+ "notes": "Use shared CI templates for lint/test/typecheck/release stages to standardize across Python repos.",
469
+ "requiredScripts": [
470
+ "ci"
471
+ ],
472
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
473
+ }
474
+ },
330
475
  {
331
476
  "ciHints": {
332
477
  "azure-devops": {
@@ -125,7 +125,7 @@
125
125
  "job": "release"
126
126
  }
127
127
  },
128
- "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history.",
128
+ "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history. Maintain a single canonical version source (for example, package.json or VERSION) that all release artifacts use.",
129
129
  "id": "semantic-versioning",
130
130
  "label": "Semantic Versioning",
131
131
  "stack": {
@@ -139,8 +139,49 @@
139
139
  "setuptools_scm",
140
140
  "towncrier"
141
141
  ],
142
- "notes": "Automate version bumping and changelog generation using setuptools_scm (git-tag based) or bumpversion with towncrier for changelog fragments. Configure CI to automatically update version in pyproject.toml, generate/update CHANGELOG.md from commit messages or changelog fragments, and create git tags. Maintain a single source of truth for versioning.",
143
- "verification": "Check that the package version in pyproject or setup configuration follows SemVer and verify that the configured tool (for example, setuptools_scm or bumpversion) automatically computes or bumps the version and generates changelog entries from commit history or fragments."
142
+ "notes": "Automate version bumping and changelog generation using setuptools_scm (git-tag based) or bumpversion with towncrier for changelog fragments. Keep pyproject.toml (or VERSION) as the single canonical version source, and have CI publish GitHub/PyPI/Docker artifacts from that same version.",
143
+ "optionalFiles": [
144
+ "VERSION",
145
+ "CHANGELOG.md"
146
+ ],
147
+ "requiredFiles": [
148
+ "pyproject.toml"
149
+ ],
150
+ "requiredScripts": [
151
+ "release"
152
+ ],
153
+ "verification": "Check that the canonical version in pyproject.toml or VERSION follows SemVer and verify that the configured tool (for example, setuptools_scm or bumpversion) computes or bumps the version and generates changelog entries from commit history or fragments."
154
+ }
155
+ },
156
+ {
157
+ "ciHints": {
158
+ "github-actions": {
159
+ "job": "release"
160
+ }
161
+ },
162
+ "description": "Use a single CI release pipeline that publishes all artifacts (GitHub releases, packages, containers) from the same canonical version source.",
163
+ "id": "unified-release-workflow",
164
+ "label": "Unified Release Workflow",
165
+ "stack": {
166
+ "exampleConfigFiles": [
167
+ ".github/workflows/release.yml",
168
+ "azure-pipelines.yml"
169
+ ],
170
+ "exampleTools": [
171
+ "setuptools_scm",
172
+ "twine",
173
+ "build",
174
+ "docker buildx"
175
+ ],
176
+ "notes": "Use a single release pipeline to publish PyPI packages, GitHub releases, and Docker images from the canonical version source (pyproject.toml or VERSION).",
177
+ "optionalFiles": [
178
+ "CHANGELOG.md",
179
+ "VERSION"
180
+ ],
181
+ "requiredScripts": [
182
+ "release"
183
+ ],
184
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
144
185
  }
145
186
  },
146
187
  {
@@ -149,10 +190,17 @@
149
190
  "job": "ci"
150
191
  }
151
192
  },
152
- "description": "Enforce structured commit messages such as Conventional Commits.",
193
+ "description": "Enforce structured commit messages such as Conventional Commits via commit-msg hooks and CI. This is required for deterministic versioning and changelog generation.",
153
194
  "id": "commit-linting",
154
195
  "label": "Commit Linting",
155
196
  "stack": {
197
+ "anyOfFiles": [
198
+ ".cz.toml",
199
+ "commitlint.config.js",
200
+ "commitlint.config.cjs",
201
+ "commitlint.config.mjs",
202
+ "commitlint.config.json"
203
+ ],
156
204
  "exampleConfigFiles": [
157
205
  ".cz.toml",
158
206
  "pyproject.toml"
@@ -160,8 +208,11 @@
160
208
  "exampleTools": [
161
209
  "commitizen"
162
210
  ],
163
- "notes": "Standardize commit messages using commitizen or a similar helper and document the required types and scopes.",
164
- "verification": "Use the configured commit helper (for example, commitizen) or hooks to create a test commit and confirm that non-conforming messages are rejected while valid ones are accepted."
211
+ "notes": "Standardize Conventional Commits using commitizen or commitlint with commit-msg hooks plus CI so changelog generation is deterministic.",
212
+ "requiredScripts": [
213
+ "commitlint"
214
+ ],
215
+ "verification": "Use the configured commit helper or hooks to create a test commit and confirm that non-conforming messages are rejected locally and in CI."
165
216
  }
166
217
  },
167
218
  {
@@ -271,7 +322,7 @@
271
322
  "job": "ci"
272
323
  }
273
324
  },
274
- "description": "Use static type checking to catch errors before runtime and enforce strictness on new code.",
325
+ "description": "Use static type checking to catch errors before runtime and enforce strictness on new code. For JS/TS stacks, require a TypeScript-first policy with strict mode and a CI typecheck step; allow JSDoc/checkJs migration for legacy JS.",
275
326
  "id": "type-checking",
276
327
  "label": "Type Checking",
277
328
  "stack": {
@@ -296,6 +347,9 @@
296
347
  "requiredFiles": [
297
348
  "pyproject.toml"
298
349
  ],
350
+ "requiredScripts": [
351
+ "typecheck"
352
+ ],
299
353
  "verification": "pyproject.toml (or mypy.ini) signals that mypy configuration is available for the repository."
300
354
  }
301
355
  },
@@ -327,6 +381,97 @@
327
381
  "verification": "Dependency lockfile is present; security scanning is configured in CI or project tooling."
328
382
  }
329
383
  },
384
+ {
385
+ "ciHints": {
386
+ "github-actions": {
387
+ "job": "ci"
388
+ }
389
+ },
390
+ "description": "Ensure builds are reproducible by pinning dependencies, base images, and tool/runtime versions. Avoid network/time variance and fail when lockfiles drift.",
391
+ "id": "deterministic-builds",
392
+ "label": "Deterministic & Hermetic Builds",
393
+ "stack": {
394
+ "anyOfFiles": [
395
+ "requirements.txt",
396
+ "poetry.lock",
397
+ "Pipfile.lock"
398
+ ],
399
+ "exampleConfigFiles": [
400
+ "requirements.txt",
401
+ "poetry.lock",
402
+ "Pipfile.lock"
403
+ ],
404
+ "exampleTools": [
405
+ "pip-tools",
406
+ "poetry",
407
+ "uv"
408
+ ],
409
+ "notes": "Use pinned lockfiles (requirements.txt or poetry.lock) and pin Python version (.python-version or tool-versions). Avoid non-deterministic installs in CI.",
410
+ "optionalFiles": [
411
+ ".python-version",
412
+ ".tool-versions"
413
+ ],
414
+ "verification": "Lockfile is present and CI installs with pinned versions only. Python runtime is pinned."
415
+ }
416
+ },
417
+ {
418
+ "ciHints": {
419
+ "github-actions": {
420
+ "job": "security"
421
+ }
422
+ },
423
+ "description": "Produce SBOMs or provenance metadata, enable secret/code scanning, and sign tags or commits for critical repos.",
424
+ "id": "provenance-security",
425
+ "label": "Provenance & Security Metadata",
426
+ "stack": {
427
+ "exampleConfigFiles": [
428
+ ".github/workflows/codeql.yml",
429
+ ".github/workflows/provenance.yml"
430
+ ],
431
+ "exampleTools": [
432
+ "cyclonedx-python",
433
+ "syft",
434
+ "codeql",
435
+ "gitleaks",
436
+ "cosign"
437
+ ],
438
+ "notes": "Generate SBOM/provenance for PyPI and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
439
+ "optionalFiles": [
440
+ "SECURITY.md",
441
+ ".github/workflows/codeql.yml"
442
+ ],
443
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
444
+ }
445
+ },
446
+ {
447
+ "ciHints": {
448
+ "github-actions": {
449
+ "job": "ci"
450
+ }
451
+ },
452
+ "description": "Adopt standard CI templates and config samples to scale across repositories, minimizing bespoke pipeline logic.",
453
+ "id": "ci-templates-automation",
454
+ "label": "CI Templates & Automation",
455
+ "stack": {
456
+ "anyOfFiles": [
457
+ ".github/workflows/ci.yml",
458
+ "azure-pipelines.yml"
459
+ ],
460
+ "exampleConfigFiles": [
461
+ ".github/workflows/ci.yml",
462
+ "azure-pipelines.yml"
463
+ ],
464
+ "exampleTools": [
465
+ "GitHub Actions reusable workflows",
466
+ "Azure DevOps templates"
467
+ ],
468
+ "notes": "Use shared CI templates for lint/test/typecheck/release stages to standardize across Python repos.",
469
+ "requiredScripts": [
470
+ "ci"
471
+ ],
472
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
473
+ }
474
+ },
330
475
  {
331
476
  "ciHints": {
332
477
  "github-actions": {
@@ -140,7 +140,7 @@
140
140
  "job": "release"
141
141
  }
142
142
  },
143
- "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history.",
143
+ "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history. Maintain a single canonical version source (for example, package.json or VERSION) that all release artifacts use.",
144
144
  "id": "semantic-versioning",
145
145
  "label": "Semantic Versioning",
146
146
  "stack": {
@@ -154,8 +154,52 @@
154
154
  "setuptools_scm",
155
155
  "towncrier"
156
156
  ],
157
- "notes": "Automate version bumping and changelog generation using setuptools_scm (git-tag based) or bumpversion with towncrier for changelog fragments. Configure CI to automatically update version in pyproject.toml, generate/update CHANGELOG.md from commit messages or changelog fragments, and create git tags. Maintain a single source of truth for versioning.",
158
- "verification": "Check that the package version in pyproject or setup configuration follows SemVer and verify that the configured tool (for example, setuptools_scm or bumpversion) automatically computes or bumps the version and generates changelog entries from commit history or fragments."
157
+ "notes": "Automate version bumping and changelog generation using setuptools_scm (git-tag based) or bumpversion with towncrier for changelog fragments. Keep pyproject.toml (or VERSION) as the single canonical version source, and have CI publish GitHub/PyPI/Docker artifacts from that same version.",
158
+ "optionalFiles": [
159
+ "VERSION",
160
+ "CHANGELOG.md"
161
+ ],
162
+ "requiredFiles": [
163
+ "pyproject.toml"
164
+ ],
165
+ "requiredScripts": [
166
+ "release"
167
+ ],
168
+ "verification": "Check that the canonical version in pyproject.toml or VERSION follows SemVer and verify that the configured tool (for example, setuptools_scm or bumpversion) computes or bumps the version and generates changelog entries from commit history or fragments."
169
+ }
170
+ },
171
+ {
172
+ "ciHints": {
173
+ "azure-devops": {
174
+ "stage": "release"
175
+ },
176
+ "github-actions": {
177
+ "job": "release"
178
+ }
179
+ },
180
+ "description": "Use a single CI release pipeline that publishes all artifacts (GitHub releases, packages, containers) from the same canonical version source.",
181
+ "id": "unified-release-workflow",
182
+ "label": "Unified Release Workflow",
183
+ "stack": {
184
+ "exampleConfigFiles": [
185
+ ".github/workflows/release.yml",
186
+ "azure-pipelines.yml"
187
+ ],
188
+ "exampleTools": [
189
+ "setuptools_scm",
190
+ "twine",
191
+ "build",
192
+ "docker buildx"
193
+ ],
194
+ "notes": "Use a single release pipeline to publish PyPI packages, GitHub releases, and Docker images from the canonical version source (pyproject.toml or VERSION).",
195
+ "optionalFiles": [
196
+ "CHANGELOG.md",
197
+ "VERSION"
198
+ ],
199
+ "requiredScripts": [
200
+ "release"
201
+ ],
202
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
159
203
  }
160
204
  },
161
205
  {
@@ -167,10 +211,17 @@
167
211
  "job": "ci"
168
212
  }
169
213
  },
170
- "description": "Enforce structured commit messages such as Conventional Commits.",
214
+ "description": "Enforce structured commit messages such as Conventional Commits via commit-msg hooks and CI. This is required for deterministic versioning and changelog generation.",
171
215
  "id": "commit-linting",
172
216
  "label": "Commit Linting",
173
217
  "stack": {
218
+ "anyOfFiles": [
219
+ ".cz.toml",
220
+ "commitlint.config.js",
221
+ "commitlint.config.cjs",
222
+ "commitlint.config.mjs",
223
+ "commitlint.config.json"
224
+ ],
174
225
  "exampleConfigFiles": [
175
226
  ".cz.toml",
176
227
  "pyproject.toml"
@@ -178,8 +229,11 @@
178
229
  "exampleTools": [
179
230
  "commitizen"
180
231
  ],
181
- "notes": "Standardize commit messages using commitizen or a similar helper and document the required types and scopes.",
182
- "verification": "Use the configured commit helper (for example, commitizen) or hooks to create a test commit and confirm that non-conforming messages are rejected while valid ones are accepted."
232
+ "notes": "Standardize Conventional Commits using commitizen or commitlint with commit-msg hooks plus CI so changelog generation is deterministic.",
233
+ "requiredScripts": [
234
+ "commitlint"
235
+ ],
236
+ "verification": "Use the configured commit helper or hooks to create a test commit and confirm that non-conforming messages are rejected locally and in CI."
183
237
  }
184
238
  },
185
239
  {
@@ -304,7 +358,7 @@
304
358
  "job": "ci"
305
359
  }
306
360
  },
307
- "description": "Use static type checking to catch errors before runtime and enforce strictness on new code.",
361
+ "description": "Use static type checking to catch errors before runtime and enforce strictness on new code. For JS/TS stacks, require a TypeScript-first policy with strict mode and a CI typecheck step; allow JSDoc/checkJs migration for legacy JS.",
308
362
  "id": "type-checking",
309
363
  "label": "Type Checking",
310
364
  "stack": {
@@ -329,6 +383,9 @@
329
383
  "requiredFiles": [
330
384
  "pyproject.toml"
331
385
  ],
386
+ "requiredScripts": [
387
+ "typecheck"
388
+ ],
332
389
  "verification": "pyproject.toml (or mypy.ini) signals that mypy configuration is available for the repository."
333
390
  }
334
391
  },
@@ -363,6 +420,106 @@
363
420
  "verification": "Dependency lockfile is present; security scanning is configured in CI or project tooling."
364
421
  }
365
422
  },
423
+ {
424
+ "ciHints": {
425
+ "azure-devops": {
426
+ "stage": "build"
427
+ },
428
+ "github-actions": {
429
+ "job": "ci"
430
+ }
431
+ },
432
+ "description": "Ensure builds are reproducible by pinning dependencies, base images, and tool/runtime versions. Avoid network/time variance and fail when lockfiles drift.",
433
+ "id": "deterministic-builds",
434
+ "label": "Deterministic & Hermetic Builds",
435
+ "stack": {
436
+ "anyOfFiles": [
437
+ "requirements.txt",
438
+ "poetry.lock",
439
+ "Pipfile.lock"
440
+ ],
441
+ "exampleConfigFiles": [
442
+ "requirements.txt",
443
+ "poetry.lock",
444
+ "Pipfile.lock"
445
+ ],
446
+ "exampleTools": [
447
+ "pip-tools",
448
+ "poetry",
449
+ "uv"
450
+ ],
451
+ "notes": "Use pinned lockfiles (requirements.txt or poetry.lock) and pin Python version (.python-version or tool-versions). Avoid non-deterministic installs in CI.",
452
+ "optionalFiles": [
453
+ ".python-version",
454
+ ".tool-versions"
455
+ ],
456
+ "verification": "Lockfile is present and CI installs with pinned versions only. Python runtime is pinned."
457
+ }
458
+ },
459
+ {
460
+ "ciHints": {
461
+ "azure-devops": {
462
+ "stage": "security"
463
+ },
464
+ "github-actions": {
465
+ "job": "security"
466
+ }
467
+ },
468
+ "description": "Produce SBOMs or provenance metadata, enable secret/code scanning, and sign tags or commits for critical repos.",
469
+ "id": "provenance-security",
470
+ "label": "Provenance & Security Metadata",
471
+ "stack": {
472
+ "exampleConfigFiles": [
473
+ ".github/workflows/codeql.yml",
474
+ ".github/workflows/provenance.yml"
475
+ ],
476
+ "exampleTools": [
477
+ "cyclonedx-python",
478
+ "syft",
479
+ "codeql",
480
+ "gitleaks",
481
+ "cosign"
482
+ ],
483
+ "notes": "Generate SBOM/provenance for PyPI and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
484
+ "optionalFiles": [
485
+ "SECURITY.md",
486
+ ".github/workflows/codeql.yml"
487
+ ],
488
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
489
+ }
490
+ },
491
+ {
492
+ "ciHints": {
493
+ "azure-devops": {
494
+ "stage": "ci"
495
+ },
496
+ "github-actions": {
497
+ "job": "ci"
498
+ }
499
+ },
500
+ "description": "Adopt standard CI templates and config samples to scale across repositories, minimizing bespoke pipeline logic.",
501
+ "id": "ci-templates-automation",
502
+ "label": "CI Templates & Automation",
503
+ "stack": {
504
+ "anyOfFiles": [
505
+ ".github/workflows/ci.yml",
506
+ "azure-pipelines.yml"
507
+ ],
508
+ "exampleConfigFiles": [
509
+ ".github/workflows/ci.yml",
510
+ "azure-pipelines.yml"
511
+ ],
512
+ "exampleTools": [
513
+ "GitHub Actions reusable workflows",
514
+ "Azure DevOps templates"
515
+ ],
516
+ "notes": "Use shared CI templates for lint/test/typecheck/release stages to standardize across Python repos.",
517
+ "requiredScripts": [
518
+ "ci"
519
+ ],
520
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
521
+ }
522
+ },
366
523
  {
367
524
  "ciHints": {
368
525
  "azure-devops": {