@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.
@@ -519,7 +519,7 @@
519
519
  "job": "release"
520
520
  }
521
521
  },
522
- "description": "Use MAJOR.MINOR.PATCH versioning with clear rules and automated changelog generation based on commit history.",
522
+ "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.",
523
523
  "enforcement": "required",
524
524
  "id": "semantic-versioning",
525
525
  "label": "Semantic Versioning",
@@ -534,8 +534,19 @@
534
534
  "exampleTools": [
535
535
  "GitVersion"
536
536
  ],
537
- "notes": "Use GitVersion to automatically compute SemVer from git history and feed it into assembly/package versions. Configure CI to auto-generate or update CHANGELOG.md from commit messages and git tags. Integrate with release pipeline to automatically version assemblies, NuGet packages, and create release notes.",
538
- "verification": "Check that versioning is driven by a SemVer-aware tool (for example, GitVersion) and verify that running the release/versioning step locally or in CI automatically produces the expected version metadata, updates project files, and generates changelog entries from commit history."
537
+ "notes": "Use GitVersion (or Directory.Build.props) as the single canonical version source, computed from git history, and feed it into assembly/package versions. Configure CI to auto-generate or update CHANGELOG.md from commit messages and git tags. Integrate with the release pipeline to version assemblies, NuGet packages, and publish GitHub releases from the same version.",
538
+ "optionalFiles": [
539
+ "GitVersion.yml",
540
+ "Directory.Build.props",
541
+ "CHANGELOG.md"
542
+ ],
543
+ "requiredFiles": [
544
+ "*.csproj"
545
+ ],
546
+ "requiredScripts": [
547
+ "release"
548
+ ],
549
+ "verification": "Check that versioning is driven by a SemVer-aware tool (for example, GitVersion) and verify that running the release/versioning step locally or in CI produces the expected version metadata, updates project files, and generates changelog entries from commit history."
539
550
  },
540
551
  "go": {
541
552
  "exampleConfigFiles": [
@@ -546,8 +557,15 @@
546
557
  "goreleaser",
547
558
  "semantic-release"
548
559
  ],
549
- "notes": "Go uses git tags for versioning (v1.2.3 format). Use goreleaser for automated releases with changelog generation. Tag versions consistently.",
550
- "verification": "Check that git tags follow vMAJOR.MINOR.PATCH format and goreleaser or similar tool generates releases and changelogs."
560
+ "notes": "Go uses git tags (v1.2.3) as the canonical version source. Use goreleaser for automated releases with changelog generation and publish GitHub/Docker artifacts from the same tag.",
561
+ "optionalFiles": [
562
+ ".goreleaser.yml",
563
+ "CHANGELOG.md"
564
+ ],
565
+ "requiredScripts": [
566
+ "release"
567
+ ],
568
+ "verification": "Check that git tags follow vMAJOR.MINOR.PATCH format and goreleaser or similar tooling generates releases and changelogs."
551
569
  },
552
570
  "python": {
553
571
  "exampleConfigFiles": [
@@ -560,8 +578,18 @@
560
578
  "setuptools_scm",
561
579
  "towncrier"
562
580
  ],
563
- "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.",
564
- "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."
581
+ "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.",
582
+ "optionalFiles": [
583
+ "VERSION",
584
+ "CHANGELOG.md"
585
+ ],
586
+ "requiredFiles": [
587
+ "pyproject.toml"
588
+ ],
589
+ "requiredScripts": [
590
+ "release"
591
+ ],
592
+ "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."
565
593
  },
566
594
  "rust": {
567
595
  "exampleConfigFiles": [
@@ -572,7 +600,16 @@
572
600
  "cargo-release",
573
601
  "semantic-release"
574
602
  ],
575
- "notes": "Version is defined in Cargo.toml. Use cargo-release or semantic-release-cargo for automated versioning. Follow Conventional Commits for changelog generation.",
603
+ "notes": "Version is defined in Cargo.toml as the canonical source. Use cargo-release or semantic-release-cargo for automated versioning and GitHub release publishing, and follow Conventional Commits for changelog generation.",
604
+ "optionalFiles": [
605
+ "CHANGELOG.md"
606
+ ],
607
+ "requiredFiles": [
608
+ "Cargo.toml"
609
+ ],
610
+ "requiredScripts": [
611
+ "release"
612
+ ],
576
613
  "verification": "Check that Cargo.toml version follows SemVer and verify changelog generation from commit history."
577
614
  },
578
615
  "typescript-js": {
@@ -585,8 +622,144 @@
585
622
  "semantic-release",
586
623
  "standard-version"
587
624
  ],
588
- "notes": "Automate version bumping and changelog generation from Conventional Commits using semantic-release or standard-version. Configure CI to automatically bump package.json version, generate/update CHANGELOG.md, create git tags, and publish release artifacts. Protect release branches and ensure release tooling only runs there.",
589
- "verification": "Check that the version field follows SemVer, and trigger the configured release workflow (for example, a dry run of semantic-release or standard-version) to confirm it automatically generates the expected next version, updates package.json, and creates/updates CHANGELOG.md with commit-based entries."
625
+ "notes": "Automate version bumping and changelog generation from Conventional Commits using semantic-release or standard-version. Keep package.json (or a VERSION file) as the single canonical version source and have CI publish npm/GitHub/Docker artifacts from that same version. Protect release branches and ensure release tooling only runs there.",
626
+ "optionalFiles": [
627
+ "VERSION",
628
+ "CHANGELOG.md"
629
+ ],
630
+ "requiredFiles": [
631
+ "package.json"
632
+ ],
633
+ "requiredScripts": [
634
+ "release"
635
+ ],
636
+ "verification": "Check that the canonical version field follows SemVer, and trigger the configured release workflow (for example, a dry run of semantic-release or standard-version) to confirm it generates the expected next version, updates package.json or VERSION, and creates/updates CHANGELOG.md with commit-based entries."
637
+ }
638
+ }
639
+ },
640
+ {
641
+ "appliesTo": {
642
+ "stacks": [
643
+ "typescript-js",
644
+ "csharp-dotnet",
645
+ "python",
646
+ "rust",
647
+ "go"
648
+ ]
649
+ },
650
+ "ciHints": {
651
+ "azure-devops": {
652
+ "stage": "release"
653
+ },
654
+ "github-actions": {
655
+ "job": "release"
656
+ }
657
+ },
658
+ "description": "Use a single CI release pipeline that publishes all artifacts (GitHub releases, packages, containers) from the same canonical version source.",
659
+ "enforcement": "required",
660
+ "id": "unified-release-workflow",
661
+ "label": "Unified Release Workflow",
662
+ "severity": "error",
663
+ "stackHints": {
664
+ "csharp-dotnet": {
665
+ "exampleConfigFiles": [
666
+ "azure-pipelines.yml",
667
+ ".github/workflows/release.yml"
668
+ ],
669
+ "exampleTools": [
670
+ "GitVersion",
671
+ "dotnet pack",
672
+ "dotnet nuget push"
673
+ ],
674
+ "notes": "Use a single release pipeline to publish NuGet packages, GitHub releases, and Docker images from the canonical version source (GitVersion or Directory.Build.props).",
675
+ "optionalFiles": [
676
+ "GitVersion.yml",
677
+ "Directory.Build.props"
678
+ ],
679
+ "requiredScripts": [
680
+ "release"
681
+ ],
682
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
683
+ },
684
+ "go": {
685
+ "exampleConfigFiles": [
686
+ ".github/workflows/release.yml",
687
+ "azure-pipelines.yml"
688
+ ],
689
+ "exampleTools": [
690
+ "goreleaser",
691
+ "docker buildx"
692
+ ],
693
+ "notes": "Use a single release pipeline (goreleaser or equivalent) to publish GitHub releases and Docker images from the same git tag.",
694
+ "optionalFiles": [
695
+ ".goreleaser.yml",
696
+ "CHANGELOG.md"
697
+ ],
698
+ "requiredScripts": [
699
+ "release"
700
+ ],
701
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
702
+ },
703
+ "python": {
704
+ "exampleConfigFiles": [
705
+ ".github/workflows/release.yml",
706
+ "azure-pipelines.yml"
707
+ ],
708
+ "exampleTools": [
709
+ "setuptools_scm",
710
+ "twine",
711
+ "build",
712
+ "docker buildx"
713
+ ],
714
+ "notes": "Use a single release pipeline to publish PyPI packages, GitHub releases, and Docker images from the canonical version source (pyproject.toml or VERSION).",
715
+ "optionalFiles": [
716
+ "CHANGELOG.md",
717
+ "VERSION"
718
+ ],
719
+ "requiredScripts": [
720
+ "release"
721
+ ],
722
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
723
+ },
724
+ "rust": {
725
+ "exampleConfigFiles": [
726
+ ".github/workflows/release.yml",
727
+ "azure-pipelines.yml"
728
+ ],
729
+ "exampleTools": [
730
+ "cargo-release",
731
+ "cargo publish",
732
+ "docker buildx"
733
+ ],
734
+ "notes": "Use a single release pipeline to publish crates.io packages, GitHub releases, and Docker images from the Cargo.toml version.",
735
+ "optionalFiles": [
736
+ "CHANGELOG.md"
737
+ ],
738
+ "requiredScripts": [
739
+ "release"
740
+ ],
741
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
742
+ },
743
+ "typescript-js": {
744
+ "exampleConfigFiles": [
745
+ ".github/workflows/release.yml",
746
+ "azure-pipelines.yml"
747
+ ],
748
+ "exampleTools": [
749
+ "semantic-release",
750
+ "changesets",
751
+ "npm publish",
752
+ "docker buildx"
753
+ ],
754
+ "notes": "Release workflow must publish npm packages, GitHub releases, and Docker images from the same canonical version (package.json or VERSION). Avoid separate manual steps or ad-hoc scripts for different artifacts.",
755
+ "optionalFiles": [
756
+ "CHANGELOG.md",
757
+ "VERSION"
758
+ ],
759
+ "requiredScripts": [
760
+ "release"
761
+ ],
762
+ "verification": "Trigger the release pipeline and confirm all artifacts share the same version number and tag."
590
763
  }
591
764
  }
592
765
  },
@@ -608,13 +781,20 @@
608
781
  "job": "ci"
609
782
  }
610
783
  },
611
- "description": "Enforce structured commit messages such as Conventional Commits.",
784
+ "description": "Enforce structured commit messages such as Conventional Commits via commit-msg hooks and CI. This is required for deterministic versioning and changelog generation.",
612
785
  "enforcement": "required",
613
786
  "id": "commit-linting",
614
787
  "label": "Commit Linting",
615
788
  "severity": "error",
616
789
  "stackHints": {
617
790
  "csharp-dotnet": {
791
+ "anyOfFiles": [
792
+ "commitlint.config.js",
793
+ "commitlint.config.cjs",
794
+ "commitlint.config.mjs",
795
+ "commitlint.config.json",
796
+ ".cz.toml"
797
+ ],
618
798
  "exampleConfigFiles": [
619
799
  "commitlint.config.*",
620
800
  ".cz.toml"
@@ -623,10 +803,20 @@
623
803
  "commitlint",
624
804
  "commitizen"
625
805
  ],
626
- "notes": "Document your commit convention and wire up a helper tool so contributors can easily follow it.",
627
- "verification": "Create a test commit following the documented commit convention and confirm that any configured commit message checks (local hooks or CI) accept the message."
806
+ "notes": "Document your Conventional Commit convention and enforce it via commit-msg hooks and CI so release tooling can compute versions deterministically.",
807
+ "requiredScripts": [
808
+ "commitlint"
809
+ ],
810
+ "verification": "Create a test commit following the documented convention and confirm that commit-msg hooks and CI checks accept it."
628
811
  },
629
812
  "go": {
813
+ "anyOfFiles": [
814
+ "commitlint.config.js",
815
+ "commitlint.config.cjs",
816
+ "commitlint.config.mjs",
817
+ "commitlint.config.json",
818
+ ".cz.toml"
819
+ ],
630
820
  "exampleConfigFiles": [
631
821
  "commitlint.config.js",
632
822
  ".cz.toml"
@@ -635,10 +825,20 @@
635
825
  "commitlint",
636
826
  "commitizen"
637
827
  ],
638
- "notes": "Use commitlint with pre-commit hooks for enforcing Conventional Commits. Consistent with goreleaser changelog generation.",
639
- "verification": "Test that non-conforming commit messages are rejected by the configured hooks or CI check."
828
+ "notes": "Use commitlint with commit-msg or pre-commit hooks plus a CI check. Conventional Commits keep goreleaser changelog generation deterministic.",
829
+ "requiredScripts": [
830
+ "commitlint"
831
+ ],
832
+ "verification": "Test that non-conforming commit messages are rejected by the configured hooks and CI check."
640
833
  },
641
834
  "python": {
835
+ "anyOfFiles": [
836
+ ".cz.toml",
837
+ "commitlint.config.js",
838
+ "commitlint.config.cjs",
839
+ "commitlint.config.mjs",
840
+ "commitlint.config.json"
841
+ ],
642
842
  "exampleConfigFiles": [
643
843
  ".cz.toml",
644
844
  "pyproject.toml"
@@ -646,10 +846,20 @@
646
846
  "exampleTools": [
647
847
  "commitizen"
648
848
  ],
649
- "notes": "Standardize commit messages using commitizen or a similar helper and document the required types and scopes.",
650
- "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."
849
+ "notes": "Standardize Conventional Commits using commitizen or commitlint with commit-msg hooks plus CI so changelog generation is deterministic.",
850
+ "requiredScripts": [
851
+ "commitlint"
852
+ ],
853
+ "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."
651
854
  },
652
855
  "rust": {
856
+ "anyOfFiles": [
857
+ "commitlint.config.js",
858
+ "commitlint.config.cjs",
859
+ "commitlint.config.mjs",
860
+ "commitlint.config.json",
861
+ ".cz.toml"
862
+ ],
653
863
  "exampleConfigFiles": [
654
864
  "commitlint.config.js",
655
865
  ".cz.toml"
@@ -658,10 +868,19 @@
658
868
  "commitlint",
659
869
  "commitizen"
660
870
  ],
661
- "notes": "Use commitlint with husky or pre-commit for enforcing Conventional Commits. Works consistently with cargo workspaces.",
662
- "verification": "Test that non-conforming commit messages are rejected by the configured hooks or CI check."
871
+ "notes": "Use commitlint with husky or pre-commit for enforcing Conventional Commits and add a CI check to keep version/changelog automation deterministic.",
872
+ "requiredScripts": [
873
+ "commitlint"
874
+ ],
875
+ "verification": "Test that non-conforming commit messages are rejected by the configured hooks and CI check."
663
876
  },
664
877
  "typescript-js": {
878
+ "anyOfFiles": [
879
+ "commitlint.config.js",
880
+ "commitlint.config.cjs",
881
+ "commitlint.config.mjs",
882
+ "commitlint.config.json"
883
+ ],
665
884
  "exampleConfigFiles": [
666
885
  "commitlint.config.*"
667
886
  ],
@@ -669,8 +888,11 @@
669
888
  "@commitlint/cli",
670
889
  "@commitlint/config-conventional"
671
890
  ],
672
- "notes": "Enforce commit message format via commit-msg hooks (e.g., Husky) before CI.",
673
- "verification": "Create a test commit using the documented convention and ensure the commit message passes the configured commit linting or wizard (for example, commitlint or commitizen)."
891
+ "notes": "Enforce Conventional Commits via commit-msg hooks (e.g., Husky) and a CI job so versioning/changelog automation is deterministic.",
892
+ "requiredScripts": [
893
+ "commitlint"
894
+ ],
895
+ "verification": "Create a test commit using the documented convention and ensure the commit message passes both local commit-msg hooks and CI checks."
674
896
  }
675
897
  }
676
898
  },
@@ -1101,7 +1323,7 @@
1101
1323
  "job": "ci"
1102
1324
  }
1103
1325
  },
1104
- "description": "Use static type checking to catch errors before runtime and enforce strictness on new code.",
1326
+ "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.",
1105
1327
  "enforcement": "required",
1106
1328
  "id": "type-checking",
1107
1329
  "label": "Type Checking",
@@ -1173,6 +1395,9 @@
1173
1395
  "requiredFiles": [
1174
1396
  "pyproject.toml"
1175
1397
  ],
1398
+ "requiredScripts": [
1399
+ "typecheck"
1400
+ ],
1176
1401
  "verification": "pyproject.toml (or mypy.ini) signals that mypy configuration is available for the repository."
1177
1402
  },
1178
1403
  "rust": {
@@ -1207,14 +1432,14 @@
1207
1432
  "exampleTools": [
1208
1433
  "TypeScript compiler (tsc)"
1209
1434
  ],
1210
- "notes": "Enable strict mode ('strict': true) and treat type-check failures as CI failures for new code; gradually expand strictness into legacy modules.",
1435
+ "notes": "Adopt a TypeScript-first policy. Require tsconfig.json with strict mode enabled ('strict': true) and enforce `npm run typecheck` (or equivalent) in CI. For legacy JS, allow JSDoc + `checkJs` or staged migration with `allowJs` while incrementally increasing coverage.",
1211
1436
  "requiredFiles": [
1212
1437
  "tsconfig.json"
1213
1438
  ],
1214
1439
  "requiredScripts": [
1215
1440
  "typecheck"
1216
1441
  ],
1217
- "verification": "Presence of tsconfig.json indicates type-checking is configured for the repository."
1442
+ "verification": "tsconfig.json exists with strict mode enabled and CI runs the typecheck script; legacy JS modules use JSDoc/checkJs or allowJs as an explicit migration path."
1218
1443
  }
1219
1444
  }
1220
1445
  },
@@ -1327,6 +1552,370 @@
1327
1552
  }
1328
1553
  }
1329
1554
  },
1555
+ {
1556
+ "appliesTo": {
1557
+ "stacks": [
1558
+ "typescript-js",
1559
+ "csharp-dotnet",
1560
+ "python",
1561
+ "rust",
1562
+ "go"
1563
+ ]
1564
+ },
1565
+ "ciHints": {
1566
+ "azure-devops": {
1567
+ "stage": "build"
1568
+ },
1569
+ "github-actions": {
1570
+ "job": "ci"
1571
+ }
1572
+ },
1573
+ "description": "Ensure builds are reproducible by pinning dependencies, base images, and tool/runtime versions. Avoid network/time variance and fail when lockfiles drift.",
1574
+ "enforcement": "required",
1575
+ "id": "deterministic-builds",
1576
+ "label": "Deterministic & Hermetic Builds",
1577
+ "severity": "error",
1578
+ "stackHints": {
1579
+ "csharp-dotnet": {
1580
+ "exampleConfigFiles": [
1581
+ "packages.lock.json",
1582
+ "global.json"
1583
+ ],
1584
+ "exampleTools": [
1585
+ "dotnet restore --locked-mode"
1586
+ ],
1587
+ "notes": "Enable packages.lock.json and use locked restore. Pin SDK versions via global.json and pin base images in Dockerfiles.",
1588
+ "optionalFiles": [
1589
+ "packages.lock.json",
1590
+ "global.json"
1591
+ ],
1592
+ "verification": "packages.lock.json or equivalent lock files exist and restore runs in locked mode. SDK versions are pinned."
1593
+ },
1594
+ "go": {
1595
+ "exampleConfigFiles": [
1596
+ "go.sum",
1597
+ "go.mod",
1598
+ ".go-version"
1599
+ ],
1600
+ "exampleTools": [
1601
+ "go env -w GOPROXY=off",
1602
+ "go mod download"
1603
+ ],
1604
+ "notes": "Use go.sum for deterministic module versions and pin Go versions (go.mod + .go-version). Avoid network variance by caching modules and pinning proxies.",
1605
+ "optionalFiles": [
1606
+ ".go-version"
1607
+ ],
1608
+ "requiredFiles": [
1609
+ "go.sum"
1610
+ ],
1611
+ "verification": "go.sum is present and builds use pinned Go versions; module downloads are cached."
1612
+ },
1613
+ "python": {
1614
+ "anyOfFiles": [
1615
+ "requirements.txt",
1616
+ "poetry.lock",
1617
+ "Pipfile.lock"
1618
+ ],
1619
+ "exampleConfigFiles": [
1620
+ "requirements.txt",
1621
+ "poetry.lock",
1622
+ "Pipfile.lock"
1623
+ ],
1624
+ "exampleTools": [
1625
+ "pip-tools",
1626
+ "poetry",
1627
+ "uv"
1628
+ ],
1629
+ "notes": "Use pinned lockfiles (requirements.txt or poetry.lock) and pin Python version (.python-version or tool-versions). Avoid non-deterministic installs in CI.",
1630
+ "optionalFiles": [
1631
+ ".python-version",
1632
+ ".tool-versions"
1633
+ ],
1634
+ "verification": "Lockfile is present and CI installs with pinned versions only. Python runtime is pinned."
1635
+ },
1636
+ "rust": {
1637
+ "exampleConfigFiles": [
1638
+ "Cargo.lock",
1639
+ "rust-toolchain.toml"
1640
+ ],
1641
+ "exampleTools": [
1642
+ "cargo build --locked"
1643
+ ],
1644
+ "notes": "Commit Cargo.lock for binaries/services and pin Rust versions with rust-toolchain.toml. Use --locked in CI.",
1645
+ "optionalFiles": [
1646
+ "rust-toolchain.toml"
1647
+ ],
1648
+ "requiredFiles": [
1649
+ "Cargo.lock"
1650
+ ],
1651
+ "verification": "Cargo.lock is present and CI uses --locked. Rust toolchain is pinned."
1652
+ },
1653
+ "typescript-js": {
1654
+ "anyOfFiles": [
1655
+ "package-lock.json",
1656
+ "pnpm-lock.yaml",
1657
+ "yarn.lock"
1658
+ ],
1659
+ "exampleConfigFiles": [
1660
+ "package-lock.json",
1661
+ "pnpm-lock.yaml",
1662
+ "yarn.lock"
1663
+ ],
1664
+ "exampleTools": [
1665
+ "npm ci",
1666
+ "pnpm install --frozen-lockfile",
1667
+ "yarn --immutable"
1668
+ ],
1669
+ "notes": "Require a lockfile and pinned Node/tool versions (.nvmrc or .tool-versions). Pin base images in Dockerfiles and avoid non-deterministic install flags.",
1670
+ "optionalFiles": [
1671
+ ".nvmrc",
1672
+ ".tool-versions"
1673
+ ],
1674
+ "verification": "Lockfile is present and CI uses a frozen/immutable install. Dockerfiles reference pinned base images."
1675
+ }
1676
+ }
1677
+ },
1678
+ {
1679
+ "appliesTo": {
1680
+ "stacks": [
1681
+ "typescript-js",
1682
+ "csharp-dotnet",
1683
+ "python",
1684
+ "rust",
1685
+ "go"
1686
+ ]
1687
+ },
1688
+ "ciHints": {
1689
+ "azure-devops": {
1690
+ "stage": "security"
1691
+ },
1692
+ "github-actions": {
1693
+ "job": "security"
1694
+ }
1695
+ },
1696
+ "description": "Produce SBOMs or provenance metadata, enable secret/code scanning, and sign tags or commits for critical repos.",
1697
+ "enforcement": "required",
1698
+ "id": "provenance-security",
1699
+ "label": "Provenance & Security Metadata",
1700
+ "severity": "error",
1701
+ "stackHints": {
1702
+ "csharp-dotnet": {
1703
+ "exampleConfigFiles": [
1704
+ ".github/workflows/codeql.yml",
1705
+ ".github/workflows/provenance.yml"
1706
+ ],
1707
+ "exampleTools": [
1708
+ "sbom-tool",
1709
+ "codeql",
1710
+ "gitleaks",
1711
+ "cosign"
1712
+ ],
1713
+ "notes": "Generate SBOM/provenance for NuGet and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
1714
+ "optionalFiles": [
1715
+ "SECURITY.md",
1716
+ ".github/workflows/codeql.yml"
1717
+ ],
1718
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
1719
+ },
1720
+ "go": {
1721
+ "exampleConfigFiles": [
1722
+ ".github/workflows/codeql.yml",
1723
+ ".github/workflows/provenance.yml"
1724
+ ],
1725
+ "exampleTools": [
1726
+ "syft",
1727
+ "cyclonedx-gomod",
1728
+ "codeql",
1729
+ "gitleaks",
1730
+ "cosign"
1731
+ ],
1732
+ "notes": "Generate SBOM/provenance for Go binaries and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
1733
+ "optionalFiles": [
1734
+ "SECURITY.md",
1735
+ ".github/workflows/codeql.yml"
1736
+ ],
1737
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
1738
+ },
1739
+ "python": {
1740
+ "exampleConfigFiles": [
1741
+ ".github/workflows/codeql.yml",
1742
+ ".github/workflows/provenance.yml"
1743
+ ],
1744
+ "exampleTools": [
1745
+ "cyclonedx-python",
1746
+ "syft",
1747
+ "codeql",
1748
+ "gitleaks",
1749
+ "cosign"
1750
+ ],
1751
+ "notes": "Generate SBOM/provenance for PyPI and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
1752
+ "optionalFiles": [
1753
+ "SECURITY.md",
1754
+ ".github/workflows/codeql.yml"
1755
+ ],
1756
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
1757
+ },
1758
+ "rust": {
1759
+ "exampleConfigFiles": [
1760
+ ".github/workflows/codeql.yml",
1761
+ ".github/workflows/provenance.yml"
1762
+ ],
1763
+ "exampleTools": [
1764
+ "cargo-cyclonedx",
1765
+ "syft",
1766
+ "codeql",
1767
+ "gitleaks",
1768
+ "cosign"
1769
+ ],
1770
+ "notes": "Generate SBOM/provenance for crates and container artifacts, enable secret scanning, and sign tags/commits for critical repos.",
1771
+ "optionalFiles": [
1772
+ "SECURITY.md",
1773
+ ".github/workflows/codeql.yml"
1774
+ ],
1775
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
1776
+ },
1777
+ "typescript-js": {
1778
+ "exampleConfigFiles": [
1779
+ ".github/workflows/codeql.yml",
1780
+ ".github/workflows/provenance.yml"
1781
+ ],
1782
+ "exampleTools": [
1783
+ "syft",
1784
+ "cyclonedx-npm",
1785
+ "codeql",
1786
+ "gitleaks",
1787
+ "cosign"
1788
+ ],
1789
+ "notes": "Generate SBOM/provenance for npm and container artifacts, enable secret scanning, and sign tags/commits for protected branches.",
1790
+ "optionalFiles": [
1791
+ "SECURITY.md",
1792
+ ".github/workflows/codeql.yml"
1793
+ ],
1794
+ "verification": "SBOM/provenance artifacts are published alongside releases, and CI runs secret/code scanning."
1795
+ }
1796
+ }
1797
+ },
1798
+ {
1799
+ "appliesTo": {
1800
+ "stacks": [
1801
+ "typescript-js",
1802
+ "csharp-dotnet",
1803
+ "python",
1804
+ "rust",
1805
+ "go"
1806
+ ]
1807
+ },
1808
+ "ciHints": {
1809
+ "azure-devops": {
1810
+ "stage": "ci"
1811
+ },
1812
+ "github-actions": {
1813
+ "job": "ci"
1814
+ }
1815
+ },
1816
+ "description": "Adopt standard CI templates and config samples to scale across repositories, minimizing bespoke pipeline logic.",
1817
+ "enforcement": "required",
1818
+ "id": "ci-templates-automation",
1819
+ "label": "CI Templates & Automation",
1820
+ "severity": "error",
1821
+ "stackHints": {
1822
+ "csharp-dotnet": {
1823
+ "anyOfFiles": [
1824
+ ".github/workflows/ci.yml",
1825
+ "azure-pipelines.yml"
1826
+ ],
1827
+ "exampleConfigFiles": [
1828
+ ".github/workflows/ci.yml",
1829
+ "azure-pipelines.yml"
1830
+ ],
1831
+ "exampleTools": [
1832
+ "GitHub Actions reusable workflows",
1833
+ "Azure DevOps templates"
1834
+ ],
1835
+ "notes": "Use shared CI templates for build/test/pack/release stages to standardize across .NET repos.",
1836
+ "requiredScripts": [
1837
+ "ci"
1838
+ ],
1839
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
1840
+ },
1841
+ "go": {
1842
+ "anyOfFiles": [
1843
+ ".github/workflows/ci.yml",
1844
+ "azure-pipelines.yml"
1845
+ ],
1846
+ "exampleConfigFiles": [
1847
+ ".github/workflows/ci.yml",
1848
+ "azure-pipelines.yml"
1849
+ ],
1850
+ "exampleTools": [
1851
+ "GitHub Actions reusable workflows",
1852
+ "Azure DevOps templates"
1853
+ ],
1854
+ "notes": "Use shared CI templates for build/test/release stages to standardize across Go repos.",
1855
+ "requiredScripts": [
1856
+ "ci"
1857
+ ],
1858
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
1859
+ },
1860
+ "python": {
1861
+ "anyOfFiles": [
1862
+ ".github/workflows/ci.yml",
1863
+ "azure-pipelines.yml"
1864
+ ],
1865
+ "exampleConfigFiles": [
1866
+ ".github/workflows/ci.yml",
1867
+ "azure-pipelines.yml"
1868
+ ],
1869
+ "exampleTools": [
1870
+ "GitHub Actions reusable workflows",
1871
+ "Azure DevOps templates"
1872
+ ],
1873
+ "notes": "Use shared CI templates for lint/test/typecheck/release stages to standardize across Python repos.",
1874
+ "requiredScripts": [
1875
+ "ci"
1876
+ ],
1877
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
1878
+ },
1879
+ "rust": {
1880
+ "anyOfFiles": [
1881
+ ".github/workflows/ci.yml",
1882
+ "azure-pipelines.yml"
1883
+ ],
1884
+ "exampleConfigFiles": [
1885
+ ".github/workflows/ci.yml",
1886
+ "azure-pipelines.yml"
1887
+ ],
1888
+ "exampleTools": [
1889
+ "GitHub Actions reusable workflows",
1890
+ "Azure DevOps templates"
1891
+ ],
1892
+ "notes": "Use shared CI templates for build/test/release stages to standardize across Rust repos.",
1893
+ "requiredScripts": [
1894
+ "ci"
1895
+ ],
1896
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
1897
+ },
1898
+ "typescript-js": {
1899
+ "anyOfFiles": [
1900
+ ".github/workflows/ci.yml",
1901
+ "azure-pipelines.yml"
1902
+ ],
1903
+ "exampleConfigFiles": [
1904
+ ".github/workflows/ci.yml",
1905
+ "azure-pipelines.yml"
1906
+ ],
1907
+ "exampleTools": [
1908
+ "GitHub Actions reusable workflows",
1909
+ "Azure DevOps templates"
1910
+ ],
1911
+ "notes": "Use shared CI templates for lint/test/build/release stages and keep repo-specific overrides minimal.",
1912
+ "requiredScripts": [
1913
+ "ci"
1914
+ ],
1915
+ "verification": "CI pipeline references a shared template or reusable workflow and follows the standard job naming."
1916
+ }
1917
+ }
1918
+ },
1330
1919
  {
1331
1920
  "appliesTo": {
1332
1921
  "stacks": [