code-standards 8.129.1__tar.gz → 8.129.4__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.
Files changed (201) hide show
  1. {code_standards-8.129.1 → code_standards-8.129.4}/PKG-INFO +1 -1
  2. {code_standards-8.129.1 → code_standards-8.129.4}/pyproject.toml +1 -1
  3. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/cli-reference.v1.json +2 -2
  4. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/lifecycle.py +10 -4
  5. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/analysis.py +14 -4
  6. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/rollout.py +35 -6
  7. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/hooks.py +37 -24
  8. {code_standards-8.129.1 → code_standards-8.129.4}/.gitignore +0 -0
  9. {code_standards-8.129.1 → code_standards-8.129.4}/LICENSE +0 -0
  10. {code_standards-8.129.1 → code_standards-8.129.4}/README.md +0 -0
  11. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/__init__.py +0 -0
  12. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/__main__.py +0 -0
  13. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/_meta.py +0 -0
  14. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/api.py +0 -0
  15. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/cli/__init__.py +0 -0
  16. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/cli/main.py +0 -0
  17. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/Mintfile.mobile.strict +0 -0
  18. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/LICENSE.actions +0 -0
  19. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/LICENSE.cronstrue +0 -0
  20. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/LICENSE.yaml +0 -0
  21. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/generate.mts +0 -0
  22. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/index.mts +0 -0
  23. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/package-lock.json +0 -0
  24. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/package.json +0 -0
  25. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser/upstream.json +0 -0
  26. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/action-parser.cjs +0 -0
  27. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/actionlint.strict.yaml +0 -0
  28. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/basedpyright.python315-watch.json +0 -0
  29. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/basedpyright.strict.json +0 -0
  30. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/checkov.strict.yml +0 -0
  31. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/compile-eslint.mts +0 -0
  32. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/detekt.strict.yml +0 -0
  33. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/devops-verification.v1.json +0 -0
  34. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/doctor.config.json +0 -0
  35. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint-compact-formatter.mts +0 -0
  36. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint-required-policy.mts +0 -0
  37. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint-selected-rules.mts +0 -0
  38. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint.application.mjs +0 -0
  39. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint.peers.json +0 -0
  40. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint.strict.mjs +0 -0
  41. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/eslint.strict.ts +0 -0
  42. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/hadolint.strict.yaml +0 -0
  43. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/ktlint.strict.editorconfig +0 -0
  44. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/markdownlint.strict.yaml +0 -0
  45. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/mobile-tools.versions.json +0 -0
  46. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/mobsf.strict.yml +0 -0
  47. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/pyright.strict.json +0 -0
  48. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/ruff.application.toml +0 -0
  49. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/ruff.cast.toml +0 -0
  50. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/ruff.python315-watch.toml +0 -0
  51. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/ruff.required.toml +0 -0
  52. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/ruff.strict.toml +0 -0
  53. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/rule-calibration-campaign.v1.json +0 -0
  54. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/rule-inventory.v1.json +0 -0
  55. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/rule-ledger.json +0 -0
  56. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/rule-level-source.mts +0 -0
  57. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/schemas/SKAFFOLD-LICENSE +0 -0
  58. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/schemas/google-build-v1-schema.json +0 -0
  59. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/schemas/google-build-v1.LICENSE +0 -0
  60. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/schemas/skaffold-v4beta7.json +0 -0
  61. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/schemas/upstream-schemas.json +0 -0
  62. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/semgrep-overrides.txt +0 -0
  63. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/shellcheck.strict.rc +0 -0
  64. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/swiftformat.strict +0 -0
  65. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/swiftlint.strict.yml +0 -0
  66. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/taplo.strict.toml +0 -0
  67. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/tflint.strict.hcl +0 -0
  68. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/tflint.version.hcl +0 -0
  69. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/tool-json.mts +0 -0
  70. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/yamllint.strict.yaml +0 -0
  71. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/configs/zizmor.strict.yml +0 -0
  72. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/__init__.py +0 -0
  73. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/__init__.py +0 -0
  74. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/age_transition.py +0 -0
  75. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/configs.py +0 -0
  76. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/devops.py +0 -0
  77. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/doctor.py +0 -0
  78. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/exclusions.py +0 -0
  79. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/hooks.py +0 -0
  80. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/launcher.py +0 -0
  81. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/manifest.py +0 -0
  82. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/native_bootstrap.py +0 -0
  83. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/packagemanager.py +0 -0
  84. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/repository_baseline.py +0 -0
  85. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/retired_suppressions.py +0 -0
  86. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/scaffold.py +0 -0
  87. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/service.py +0 -0
  88. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/transaction.py +0 -0
  89. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/upgrade.py +0 -0
  90. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/adoption/uvtool.py +0 -0
  91. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/catalogs/__init__.py +0 -0
  92. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/catalogs/slack_automations.py +0 -0
  93. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/corpus/__init__.py +0 -0
  94. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/corpus/manifest.py +0 -0
  95. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/corpus/snapshot.py +0 -0
  96. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/diagnostics/__init__.py +0 -0
  97. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/diagnostics/analysis.schema.json +0 -0
  98. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/diagnostics/baseline.py +0 -0
  99. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/diagnostics/models.py +0 -0
  100. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/diagnostics/serialize.py +0 -0
  101. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/diagnostics/source.py +0 -0
  102. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/filesystem.py +0 -0
  103. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/json_boundary.py +0 -0
  104. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/__init__.py +0 -0
  105. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/action_metadata.py +0 -0
  106. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/chart_schemas.py +0 -0
  107. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/cloudbuild.py +0 -0
  108. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/cloudbuild_schema.py +0 -0
  109. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/complexity_baseline.py +0 -0
  110. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/devops_programs.py +0 -0
  111. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/devops_schema.py +0 -0
  112. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/devops_source.py +0 -0
  113. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/devops_tools.py +0 -0
  114. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/duplicate_code.py +0 -0
  115. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/embedded_shell.py +0 -0
  116. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/external.py +0 -0
  117. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/kubernetes_context.py +0 -0
  118. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/library_policy.py +0 -0
  119. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/mobile_tools.py +0 -0
  120. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/policy.py +0 -0
  121. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/prepared_devops.py +0 -0
  122. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/prepared_kubernetes.py +0 -0
  123. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/prepared_native.py +0 -0
  124. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/python_fixes.py +0 -0
  125. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/repo_standards.py +0 -0
  126. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/runner.py +0 -0
  127. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/scheduling.py +0 -0
  128. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/security_tools.py +0 -0
  129. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/shell_ast.py +0 -0
  130. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/shell_format.py +0 -0
  131. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/shell_policy.py +0 -0
  132. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/test_value.py +0 -0
  133. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/text_rule_base.py +0 -0
  134. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/text_rules/__init__.py +0 -0
  135. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/text_rules/_registry.py +0 -0
  136. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/text_rules/cloudbuild_contract.py +0 -0
  137. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/textlint.py +0 -0
  138. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/toml_literals.py +0 -0
  139. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/linting/unused_modules.py +0 -0
  140. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/__init__.py +0 -0
  141. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/_values.py +0 -0
  142. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/artifacts.py +0 -0
  143. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/causality.py +0 -0
  144. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/changes.py +0 -0
  145. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/ci_artifacts.py +0 -0
  146. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/make_checks.py +0 -0
  147. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/metadata_verification.py +0 -0
  148. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/native_test_setup.py +0 -0
  149. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/process.py +0 -0
  150. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/publish.py +0 -0
  151. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/registry.py +0 -0
  152. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/release_age.py +0 -0
  153. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/release_detect.py +0 -0
  154. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/retirement.py +0 -0
  155. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/reviewed_analysis.py +0 -0
  156. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/status.py +0 -0
  157. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/tags.py +0 -0
  158. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/test_selection.py +0 -0
  159. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/typescript.py +0 -0
  160. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/verification_process.py +0 -0
  161. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/release/wheel_tests.py +0 -0
  162. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/__init__.py +0 -0
  163. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/cli_reference_artifact.py +0 -0
  164. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/cloudbuild_schema_projection.py +0 -0
  165. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/comment_corpus.py +0 -0
  166. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/config_generation.py +0 -0
  167. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/docs.py +0 -0
  168. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/immutable_git.py +0 -0
  169. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/ledger.py +0 -0
  170. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/repository.py +0 -0
  171. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/ruff_freshness.py +0 -0
  172. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_authoring.py +0 -0
  173. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_catalog_artifact.py +0 -0
  174. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_changes.py +0 -0
  175. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_checkout.py +0 -0
  176. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_dependencies.py +0 -0
  177. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_examples.py +0 -0
  178. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_imports.mts +0 -0
  179. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_inventory_artifact.py +0 -0
  180. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_level_source.py +0 -0
  181. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_lifecycle.py +0 -0
  182. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_maintenance.py +0 -0
  183. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/rule_registration.py +0 -0
  184. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/shell_checks.py +0 -0
  185. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/repository/third_party_catalog_artifact.py +0 -0
  186. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/rules/__init__.py +0 -0
  187. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/rules/catalog.py +0 -0
  188. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/rules/contracts.py +0 -0
  189. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/rules/corpus_runner.py +0 -0
  190. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/rules/evaluation.py +0 -0
  191. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/schema_boundary.py +0 -0
  192. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/setup/__init__.py +0 -0
  193. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/setup/repository.py +0 -0
  194. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/typed_containers.py +0 -0
  195. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/libs/yaml_boundary.py +0 -0
  196. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/py.typed +0 -0
  197. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/schemas/__init__.py +0 -0
  198. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/schemas/_paths.py +0 -0
  199. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/schemas/rule-catalog.v1.json +0 -0
  200. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/schemas/rule-catalog.v1.schema.json +0 -0
  201. {code_standards-8.129.1 → code_standards-8.129.4}/src/sarj_standards/schemas/slack-automations.v1.schema.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code-standards
3
- Version: 8.129.1
3
+ Version: 8.129.4
4
4
  Summary: One deterministic quality gate for Sarj Python, TypeScript, Swift, Kotlin, shell, SQL, IaC, and repository policy.
5
5
  Project-URL: Homepage, https://code-standards.sarj.ai/
6
6
  Project-URL: Documentation, https://code-standards.sarj.ai/cli/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "code-standards"
3
- version = "8.129.1"
3
+ version = "8.129.4"
4
4
  description = "One deterministic quality gate for Sarj Python, TypeScript, Swift, Kotlin, shell, SQL, IaC, and repository policy."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.14"
@@ -3305,6 +3305,6 @@
3305
3305
  },
3306
3306
  "program": "code-standards",
3307
3307
  "schemaVersion": 1,
3308
- "summary": "Adopt, check, fix, diagnose, and update sarj-ai standards (v8.129.1).",
3309
- "version": "8.129.1"
3308
+ "summary": "Adopt, check, fix, diagnose, and update sarj-ai standards (v8.129.4).",
3309
+ "version": "8.129.4"
3310
3310
  }
@@ -490,7 +490,9 @@ def execute(commands: Iterable[Command]) -> int:
490
490
  hook_transaction: transaction.FileTransaction | None = None
491
491
  try:
492
492
  if command.label in {_PRECOMMIT_HOOK_LABEL, _LEFTHOOK_HOOK_LABEL}:
493
- hook_transaction = _capture_hook_transaction(command.cwd)
493
+ hook_transaction = _capture_hook_transaction(
494
+ command.cwd, lefthook=command.label == _LEFTHOOK_HOOK_LABEL
495
+ )
494
496
  completed = subprocess.run( # ruff: ignore[subprocess-without-shell-equals-true] -- pass the fixed executable as an argv sequence with shell execution disabled.
495
497
  [executable, *command.argv[1:]],
496
498
  cwd=command.cwd,
@@ -498,9 +500,9 @@ def execute(commands: Iterable[Command]) -> int:
498
500
  env=_command_environment(),
499
501
  timeout=_COMMAND_TIMEOUT.total_seconds(),
500
502
  )
501
- except subprocess.TimeoutExpired:
503
+ except subprocess.TimeoutExpired as exc:
502
504
  _report_hook_rollback(hook_transaction)
503
- sys.stderr.write(f"error: {command.label} exceeded {_COMMAND_TIMEOUT.total_seconds():g}s and was stopped\n")
505
+ sys.stderr.write(f"error: {command.label} exceeded {exc.timeout:g}s and was stopped\n")
504
506
  return 2
505
507
  except BaseException:
506
508
  _report_hook_rollback(hook_transaction)
@@ -518,7 +520,11 @@ def execute(commands: Iterable[Command]) -> int:
518
520
  return 0
519
521
 
520
522
 
521
- def _capture_hook_transaction(root: Path) -> transaction.FileTransaction:
523
+ def _capture_hook_transaction(root: Path, *, lefthook: bool = False) -> transaction.FileTransaction:
524
+ if lefthook:
525
+ from sarj_standards.libs.repository import hooks as repository_hooks # ruff: ignore[import-outside-top-level] -- load the selected manager's resolved hook ownership only for Lefthook installation.
526
+
527
+ return repository_hooks.capture_transaction(root)
522
528
  hooks_dir = _precommit_hook_path(root).parent
523
529
  names = (
524
530
  "pre-commit",
@@ -297,8 +297,12 @@ def _run_native(
297
297
  else:
298
298
  native_result = checker_module.analyze(selected_rules, paths)
299
299
  cache: dict[Path, SourceDocument | PythonSourceDocument | None] = {}
300
+ resolved_paths: dict[Path, Path] = {}
300
301
  diagnostics = tuple(
301
- normalize_native(item, source=name, root=root, metadata=metadata, documents=cache) for item in native_result
302
+ normalize_native(
303
+ item, source=name, root=root, metadata=metadata, documents=cache, resolved_paths=resolved_paths
304
+ )
305
+ for item in native_result
302
306
  )
303
307
  return ToolReport(
304
308
  name,
@@ -375,8 +379,13 @@ def normalize_native(
375
379
  root: Path,
376
380
  metadata: Mapping[str, _NativeRuleMetadata],
377
381
  documents: dict[Path, SourceDocument | PythonSourceDocument | None],
382
+ resolved_paths: dict[Path, Path] | None = None,
378
383
  ) -> Diagnostic:
379
- resolved = item.path.resolve()
384
+ resolved = None if resolved_paths is None else resolved_paths.get(item.path)
385
+ if resolved is None:
386
+ resolved = item.path.resolve()
387
+ if resolved_paths is not None:
388
+ resolved_paths[item.path] = resolved
380
389
  document = documents.get(resolved)
381
390
  if resolved not in documents:
382
391
  try:
@@ -400,16 +409,17 @@ def normalize_native(
400
409
 
401
410
  if item.code in PROTECTED_SUPPRESSION_CODES:
402
411
  tags = ("non-baselineable", "required-source-policy")
412
+ relative_path = _relative_path(resolved, root)
403
413
  return Diagnostic(
404
414
  code=item.code,
405
415
  rule_id=rule_id,
406
416
  message=item.message,
407
417
  severity=_severity(item),
408
418
  source=source,
409
- location=Location(_relative_path(resolved, root), position=position),
419
+ location=Location(relative_path, position=position),
410
420
  help=help_text,
411
421
  tags=tags,
412
- fixes=_python_fixes(item, document, _relative_path(resolved, root)) if source == "sarj-python-lint" else (),
422
+ fixes=_python_fixes(item, document, relative_path) if source == "sarj-python-lint" else (),
413
423
  )
414
424
 
415
425
 
@@ -1610,21 +1610,20 @@ def _apply_one( # ruff: ignore[too-many-locals] - one transaction binds verific
1610
1610
  raise RolloutError(msg + process_failure_detail(exc)) from exc
1611
1611
  repository_baselines = repository_baseline_migration(repo, previous_repository_baseline)
1612
1612
  assert_consumer_base_current(consumer, base_sha, runner)
1613
- report("refreshing scoped baselines")
1613
+ report("bootstrapping consumer and refreshing scoped baselines")
1614
1614
  baseline_rules = rollout_baseline_rules(
1615
1615
  consumer,
1616
1616
  previous_react_doctor_policy,
1617
1617
  react_doctor_policy_snapshot(repo),
1618
1618
  )
1619
- allowed_baseline_paths, baseline_path, expected_baseline = _prepare_rollout_baseline(
1619
+ allowed_baseline_paths, baseline_path, expected_baseline, bootstrap = _prepare_rollout_baseline(
1620
1620
  consumer, repo, candidate_runner, baseline_rules, tool_prefix, tool=tool, environment=unauthenticated
1621
1621
  )
1622
1622
  allowed_baseline_paths |= frozenset(path.relative_to(repo).as_posix() for path in repository_baselines)
1623
- report("diagnosing adoption and bootstrapping consumer")
1623
+ report("diagnosing adoption")
1624
1624
  doctor = candidate_runner.run((*tool_prefix, *tool, "doctor"), cwd=repo, env=unauthenticated, check=False)
1625
1625
  if doctor.returncode != 0:
1626
1626
  failures.append("Standards doctor failed:\n" + verification_detail(doctor))
1627
- bootstrap = run_consumer_bootstrap(repo, tool_prefix, candidate_runner, unauthenticated)
1628
1627
  assert_baseline_unchanged(baseline_path, expected_baseline)
1629
1628
  assert_baselines_unchanged(repository_baselines)
1630
1629
  consumer_baselines = _update_consumer_baselines(
@@ -2602,6 +2601,7 @@ class _RolloutBaseline(NamedTuple):
2602
2601
  allowed_paths: frozenset[str]
2603
2602
  path: Path | None
2604
2603
  expected: bytes | None
2604
+ bootstrap: subprocess.CompletedProcess[str] | None
2605
2605
 
2606
2606
 
2607
2607
  def _prepare_rollout_baseline(
@@ -2626,7 +2626,9 @@ def _prepare_rollout_baseline(
2626
2626
  "consumer manifest does not declare diagnostic_baseline"
2627
2627
  )
2628
2628
  raise RolloutError(msg)
2629
- if baseline_path is not None and baseline_relative is not None and baseline_rules:
2629
+ # Declared generators must finish before analysis captures accepted diagnostics.
2630
+ bootstrap = _bootstrap_for_baseline(repo, tool_prefix, runner, environment, baseline_path=baseline_path)
2631
+ if bootstrap is None and baseline_path is not None and baseline_relative is not None and baseline_rules:
2630
2632
  baseline_command = [
2631
2633
  *tool_prefix,
2632
2634
  *tool,
@@ -2649,7 +2651,34 @@ def _prepare_rollout_baseline(
2649
2651
  msg = f"{consumer.name}: scoped diagnostic baseline generation did not create {baseline_path}"
2650
2652
  raise RolloutError(msg)
2651
2653
  expected_baseline = None if baseline_path is None or not baseline_path.is_file() else baseline_path.read_bytes()
2652
- return _RolloutBaseline(allowed_baseline_paths, baseline_path, expected_baseline)
2654
+ return _RolloutBaseline(allowed_baseline_paths, baseline_path, expected_baseline, bootstrap)
2655
+
2656
+
2657
+ def _bootstrap_for_baseline(
2658
+ repo: Path,
2659
+ tool_prefix: tuple[str, ...],
2660
+ runner: CommandRunner,
2661
+ environment: Mapping[str, str],
2662
+ *,
2663
+ baseline_path: Path | None,
2664
+ ) -> subprocess.CompletedProcess[str] | None:
2665
+ before = {repo / repository_baseline.PATH: repository_baseline.read_optional(repo)}
2666
+ if baseline_path is not None:
2667
+ before[baseline_path] = baseline_path.read_bytes() if baseline_path.is_file() else None
2668
+ bootstrap = run_consumer_bootstrap(repo, tool_prefix, runner, environment)
2669
+ adopted = load_consumer_manifest(repo)
2670
+ relative = None if adopted is None else adopted.diagnostic_baseline
2671
+ configured_path = None if relative is None else repo / relative
2672
+ if baseline_path != configured_path:
2673
+ msg = "consumer bootstrap changed the diagnostic baseline path"
2674
+ raise RolloutError(msg)
2675
+ for path, contents in before.items():
2676
+ if contents is not None or path.exists() or path.is_symlink():
2677
+ assert_baseline_unchanged(path, contents)
2678
+ if bootstrap is not None and baseline_path is not None and not baseline_path.is_file():
2679
+ msg = "consumer bootstrap failed before the diagnostic baseline was available:\n"
2680
+ raise RolloutError(msg + verification_detail(bootstrap))
2681
+ return bootstrap
2653
2682
 
2654
2683
 
2655
2684
  def _verify_rollout_patch(
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from datetime import timedelta
3
4
  import hashlib
4
5
  import os
5
6
  from pathlib import Path
@@ -20,6 +21,9 @@ from sarj_standards.libs.typed_containers import is_object_mapping
20
21
 
21
22
 
22
23
  _VERSION: Final = "2.2.1"
24
+ _CORE_HOOKS: Final = ("pre-commit", "pre-push", "commit-msg")
25
+ _LFS_POST_HOOKS: Final = ("post-checkout", "post-commit", "post-merge")
26
+ _DISCOVERY_TIMEOUT: Final = timedelta(seconds=5)
23
27
  _ARCHITECTURES: Final = MappingProxyType({"aarch64": "arm64", "amd64": "x86_64"})
24
28
  _EXPORT_ASSIGNMENT_PARTS: Final = 2
25
29
  _UVX_PATH_MARKER: Final = "# sarj-standards: uvx-path"
@@ -41,9 +45,7 @@ def install(root: Path) -> int:
41
45
  raise OSError(msg)
42
46
  native_binary = _native_binary()
43
47
  durable_binary = _hook_path(root, "pre-commit").parent / f".sarj-lefthook{native_binary.suffix}"
44
- hook_targets = _hook_transaction_targets(durable_binary.parent)
45
- transaction.validate_targets(durable_binary.parent, hook_targets)
46
- hook_transaction = transaction.FileTransaction.capture(durable_binary.parent, hook_targets)
48
+ hook_transaction = capture_transaction(root)
47
49
  try:
48
50
  _install_managed_hooks(root, binary, native_binary, durable_binary, Path(uvx))
49
51
  except BaseException as exc:
@@ -93,13 +95,20 @@ def _install_managed_hooks(
93
95
 
94
96
  def _configured_hooks(root: Path, binary: Path) -> frozenset[str]:
95
97
  completed = subprocess.run( # ruff: ignore[subprocess-without-shell-equals-true] -- pass the fixed executable as an argv sequence with shell execution disabled.
96
- [str(binary), "dump", "--format", "json"], cwd=root, check=True, capture_output=True, text=True
98
+ [str(binary), "dump", "--format", "json"],
99
+ cwd=root,
100
+ check=True,
101
+ capture_output=True,
102
+ text=True,
103
+ timeout=_DISCOVERY_TIMEOUT.total_seconds(),
97
104
  )
98
105
  configuration = parse_json(completed.stdout)
99
106
  if not is_object_mapping(configuration):
100
107
  msg = "Lefthook resolved configuration must be a JSON object"
101
108
  raise ValueError(msg)
102
- return frozenset(name for name in configuration if isinstance(name, str))
109
+ configured = frozenset(name for name in configuration if isinstance(name, str))
110
+ # Native install refreshes remotes, so only local post hooks have stable ownership before installation.
111
+ return configured.difference(_LFS_POST_HOOKS) if configuration.get("remotes") else configured
103
112
 
104
113
 
105
114
  def _harden_precommit_entry(contents: str, root: Path) -> str:
@@ -127,19 +136,22 @@ def _harden_managed_call(contents: str, *, hook_type: str) -> str:
127
136
  return contents.replace(original, expected, 1)
128
137
 
129
138
 
130
- def _hook_transaction_targets(hooks_dir: Path) -> tuple[Path, ...]:
131
- return tuple(
132
- hooks_dir / name
133
- for name in (
134
- "pre-commit",
135
- "pre-commit.legacy",
136
- "commit-msg",
137
- "commit-msg.legacy",
138
- "pre-push",
139
- "pre-push.legacy",
140
- ".sarj-lefthook",
141
- ".sarj-lefthook.exe",
142
- )
139
+ def capture_transaction(root: Path) -> transaction.FileTransaction:
140
+ hooks_dir = _hook_path(root, "pre-commit").parent
141
+ transaction.validate_targets(hooks_dir, _hook_transaction_targets(hooks_dir, frozenset()))
142
+ configured = _configured_hooks(root, _binary("lefthook"))
143
+ paths = _hook_transaction_targets(hooks_dir, configured)
144
+ transaction.validate_targets(hooks_dir, paths)
145
+ return transaction.FileTransaction.capture(hooks_dir, paths)
146
+
147
+
148
+ def _hook_transaction_targets(hooks_dir: Path, configured: frozenset[str]) -> tuple[Path, ...]:
149
+ post_hooks = tuple(name for name in _LFS_POST_HOOKS if name in configured)
150
+ return (
151
+ *(hooks_dir / name for hook in _CORE_HOOKS for name in (hook, f"{hook}.legacy")),
152
+ *(hooks_dir / name for hook in post_hooks for name in (hook, f"{hook}.legacy", f"{hook}.old")),
153
+ hooks_dir / ".sarj-lefthook",
154
+ hooks_dir / ".sarj-lefthook.exe",
143
155
  )
144
156
 
145
157
 
@@ -286,11 +298,7 @@ def _native_binary() -> Path:
286
298
 
287
299
 
288
300
  def _hook_paths(root: Path) -> list[Path]:
289
- return [
290
- path
291
- for hook_name in ("pre-commit", "pre-push", "commit-msg")
292
- if (path := _hook_path(root, hook_name)).is_file()
293
- ]
301
+ return [path for hook_name in (*_CORE_HOOKS, *_LFS_POST_HOOKS) if (path := _hook_path(root, hook_name)).is_file()]
294
302
 
295
303
 
296
304
  def _hook_path(root: Path, hook_name: str) -> Path:
@@ -313,5 +321,10 @@ def _git(root: Path, *args: str) -> str:
313
321
  msg = "git is required to manage repository hooks"
314
322
  raise OSError(msg)
315
323
  return subprocess.run( # ruff: ignore[subprocess-without-shell-equals-true] -- pass the fixed executable as an argv sequence with shell execution disabled.
316
- [executable, *args], cwd=root, check=True, capture_output=True, text=True
324
+ [executable, *args],
325
+ cwd=root,
326
+ check=True,
327
+ capture_output=True,
328
+ text=True,
329
+ timeout=_DISCOVERY_TIMEOUT.total_seconds(),
317
330
  ).stdout