adr-check 0.1.0__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 (48) hide show
  1. adr_check-0.1.0/.betterleaks.toml +24 -0
  2. adr_check-0.1.0/.editorconfig +19 -0
  3. adr_check-0.1.0/.gitattributes +5 -0
  4. adr_check-0.1.0/.github/CODEOWNERS +6 -0
  5. adr_check-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +17 -0
  6. adr_check-0.1.0/.github/ISSUE_TEMPLATE/config.yml +3 -0
  7. adr_check-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +17 -0
  8. adr_check-0.1.0/.github/actionlint.yaml +11 -0
  9. adr_check-0.1.0/.github/dependabot.yml +26 -0
  10. adr_check-0.1.0/.github/pull_request_template.md +34 -0
  11. adr_check-0.1.0/.github/workflows/lint-pr.yml +44 -0
  12. adr_check-0.1.0/.github/workflows/pre-commit.yml +53 -0
  13. adr_check-0.1.0/.github/workflows/release-please.yml +59 -0
  14. adr_check-0.1.0/.github/workflows/tests.yml +41 -0
  15. adr_check-0.1.0/.gitignore +29 -0
  16. adr_check-0.1.0/.markdownlint.jsonc +7 -0
  17. adr_check-0.1.0/.markdownlintignore +4 -0
  18. adr_check-0.1.0/.mdformat.toml +5 -0
  19. adr_check-0.1.0/.pre-commit-config.yaml +115 -0
  20. adr_check-0.1.0/.pre-commit-hooks.yaml +8 -0
  21. adr_check-0.1.0/.release-please-manifest.json +3 -0
  22. adr_check-0.1.0/AGENTS.md +120 -0
  23. adr_check-0.1.0/CHANGELOG.md +10 -0
  24. adr_check-0.1.0/CLAUDE.md +6 -0
  25. adr_check-0.1.0/LICENSE +21 -0
  26. adr_check-0.1.0/PKG-INFO +278 -0
  27. adr_check-0.1.0/README.md +262 -0
  28. adr_check-0.1.0/SECURITY.md +28 -0
  29. adr_check-0.1.0/action.yml +56 -0
  30. adr_check-0.1.0/codecov.yml +16 -0
  31. adr_check-0.1.0/pyproject.toml +125 -0
  32. adr_check-0.1.0/release-please-config.json +16 -0
  33. adr_check-0.1.0/scripts/bootstrap_repo.py +327 -0
  34. adr_check-0.1.0/scripts/test_bootstrap_repo.py +261 -0
  35. adr_check-0.1.0/src/adr_check/__init__.py +1 -0
  36. adr_check-0.1.0/src/adr_check/adr.py +334 -0
  37. adr_check-0.1.0/src/adr_check/ci.py +234 -0
  38. adr_check-0.1.0/src/adr_check/cli.py +87 -0
  39. adr_check-0.1.0/src/adr_check/py.typed +0 -0
  40. adr_check-0.1.0/tests/adrs.py +52 -0
  41. adr_check-0.1.0/tests/data/0001-record-architecture-decisions.md +63 -0
  42. adr_check-0.1.0/tests/data/0002-use-the-template.md +70 -0
  43. adr_check-0.1.0/tests/gitrepo.py +66 -0
  44. adr_check-0.1.0/tests/test_action.py +92 -0
  45. adr_check-0.1.0/tests/test_adr.py +445 -0
  46. adr_check-0.1.0/tests/test_ci.py +540 -0
  47. adr_check-0.1.0/tests/test_cli.py +205 -0
  48. adr_check-0.1.0/uv.lock +255 -0
@@ -0,0 +1,24 @@
1
+ [extend]
2
+ useDefault = true
3
+
4
+ # Build output, if a language template's .gitignore later covers it: never
5
+ # committed, and derived from sources that are scanned anyway.
6
+ [[allowlists]]
7
+ description = "Generated output, per .gitignore — never committed, and derived from sources that are scanned"
8
+ paths = [
9
+ '''(?:^|/)coverage/''',
10
+ '''(?:^|/)coverage\.xml$''',
11
+ '''(?:^|/)\.coverage$''',
12
+ '''(?:^|/)dist/''',
13
+ '''(?:^|/)build/''',
14
+ '''(?:^|/)out/''',
15
+ ]
16
+
17
+ # Parallel checkouts, read as a second copy of the tree: the same findings
18
+ # twice, against whichever branch that worktree is on. Its own commits are
19
+ # still covered, by the staged-diff hook and by pre-commit.yml on its PR.
20
+ [[allowlists]]
21
+ description = "Git worktrees — other checkouts of this repository, scanned on their own branch"
22
+ paths = [
23
+ '''(?:^|/)\.worktrees/''',
24
+ ]
@@ -0,0 +1,19 @@
1
+ # Mirrors what the pre-commit hooks enforce, so an editor writes a conforming
2
+ # file instead of a hook rewriting it after the fact. See https://editorconfig.org.
3
+ root = true
4
+
5
+ [*]
6
+ charset = utf-8
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+ indent_style = space
11
+
12
+ [*.md]
13
+ # trailing-whitespace runs with --markdown-linebreak-ext=md, keeping two-space
14
+ # hard line breaks; trimming here would destroy what that hook protects.
15
+ trim_trailing_whitespace = false
16
+ max_line_length = 100
17
+
18
+ [*.{yml,yaml}]
19
+ indent_size = 2
@@ -0,0 +1,5 @@
1
+ # eol=lf so a Windows checkout gets LF too, not just the index.
2
+ * text=auto eol=lf
3
+
4
+ # CRLF breaks a shebang, so keep this one explicit.
5
+ *.sh text eol=lf
@@ -0,0 +1,6 @@
1
+ # Replace this handle in every repo created from this template: a team that
2
+ # does not exist matches nobody, and GitHub reports no error when it happens.
3
+ # This only requests a review. It withholds merge until one arrives where the
4
+ # branch ruleset also turns on "Require review from Code Owners".
5
+
6
+ * @agentic-delivery-au/engineering
@@ -0,0 +1,17 @@
1
+ name: Bug report
2
+ description: Something does not work the way it should
3
+ labels: ["bug"]
4
+ body:
5
+ - type: textarea
6
+ id: what-happened
7
+ attributes:
8
+ label: What happened, and what did you expect instead?
9
+ description: Enough detail that someone can see the problem without asking a follow-up.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: reproduction
15
+ attributes:
16
+ label: How to reproduce it
17
+ description: The command, file, or steps. Leave this blank if it is not reproducible on demand.
@@ -0,0 +1,3 @@
1
+ # Every PR has to reference an issue, so a one-line issue must stay possible;
2
+ # the forms are a starting point, not a toll gate.
3
+ blank_issues_enabled: true
@@ -0,0 +1,17 @@
1
+ name: Feature request
2
+ description: Something this repo should do that it does not do yet
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: textarea
6
+ id: problem
7
+ attributes:
8
+ label: What problem does this solve?
9
+ description: The problem rather than the solution — why the current behaviour is not enough.
10
+ validations:
11
+ required: true
12
+
13
+ - type: textarea
14
+ id: approach
15
+ attributes:
16
+ label: Approach
17
+ description: If you already have one in mind. A sentence is enough; the rest is the discussion.
@@ -0,0 +1,11 @@
1
+ # actionlint checks action inputs against a generated snapshot of popular
2
+ # actions, and its entry for create-github-app-token@v3 still requires the
3
+ # deprecated app-id and does not know the client-id that replaced it. Upstream's
4
+ # action.yml at v3.2.0 marks app-id "Use 'client-id' instead". Scoped to the two
5
+ # messages so everything else about this workflow is still checked; remove it
6
+ # once the snapshot catches up.
7
+ paths:
8
+ .github/workflows/release-please.yml:
9
+ ignore:
10
+ - 'missing input "app-id" which is required by action "actions/create-github-app-token@v3"'
11
+ - 'input "client-id" is not defined in action "actions/create-github-app-token@v3"'
@@ -0,0 +1,26 @@
1
+ version: 2
2
+
3
+ updates:
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "monthly"
8
+ groups:
9
+ actions:
10
+ patterns:
11
+ - "*"
12
+ commit-message:
13
+ prefix: "chore(deps)"
14
+
15
+ # The dev dependency group pins exact versions, per the Python coding
16
+ # standard, so this is the only thing that moves them.
17
+ - package-ecosystem: "uv"
18
+ directory: "/"
19
+ schedule:
20
+ interval: "monthly"
21
+ groups:
22
+ python:
23
+ patterns:
24
+ - "*"
25
+ commit-message:
26
+ prefix: "chore(deps)"
@@ -0,0 +1,34 @@
1
+ <!--
2
+ A reviewer, human or LLM, reads this before your diff.
3
+
4
+ The PR title becomes the commit subject on the trunk: Conventional Commits,
5
+ lowercase, 72 characters or fewer. The description becomes the commit body, so
6
+ everything below is permanent. AGENTS.md has the full conventions.
7
+ -->
8
+
9
+ ## What
10
+
11
+ <!--
12
+ One paragraph, readable without opening the diff. Add why the change was needed,
13
+ and anything about the approach that would surprise a reviewer, where those are
14
+ not already obvious from the diff or the linked issue. A typo fix needs a
15
+ sentence; a change of approach needs the reasoning.
16
+ -->
17
+
18
+ ## Testing
19
+
20
+ <!--
21
+ How you verified this. "Tested manually" is not enough. Say what you tested and
22
+ how. Write "None" if you did not verify it, because an empty field reads as an
23
+ oversight rather than a decision.
24
+
25
+ For a skill change, the useful evidence is that you loaded the skill and ran it
26
+ against something real, not that the markdown renders.
27
+ -->
28
+
29
+ Fixes: #
30
+
31
+ <!--
32
+ Fixes closes the issue on merge. Use Refs: instead where this is one of several
33
+ PRs against the same issue, so only the last one closes it.
34
+ -->
@@ -0,0 +1,44 @@
1
+ name: 'Lint PR'
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - opened
7
+ - reopened
8
+ - edited
9
+ - synchronize
10
+
11
+ # Keyed on the workflow too: concurrency groups are repo-wide, so without it this
12
+ # would cancel the pre-commit run for the same PR.
13
+ concurrency:
14
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ main:
19
+ name: Validate PR title
20
+ runs-on: ubuntu-slim
21
+ permissions:
22
+ pull-requests: read
23
+ steps:
24
+ # Dependabot titles its own PRs and we don't control the casing it picks
25
+ # (e.g. "Bump actions/cache from 4 to 6"), so it fails the lowercase check
26
+ # below by design rather than by mistake.
27
+ #
28
+ # This condition has to stay on the step, not the job. `Validate PR title`
29
+ # is a required status check, and a skipped job never reports a conclusion,
30
+ # so hoisting it to the job would leave every Dependabot PR permanently
31
+ # blocked. A job whose only step is skipped still succeeds.
32
+ - uses: amannn/action-semantic-pull-request@v6
33
+ if: github.event.pull_request.user.login != 'dependabot[bot]'
34
+ env:
35
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36
+ with:
37
+ # PR title must not start with a capital letter
38
+ subjectPattern: ^(?![A-Z]).+$
39
+ # If the PR only contains a single commit, the action will validate that
40
+ # it matches the configured pattern.
41
+ validateSingleCommit: true
42
+ # Related to `validateSingleCommit` you can opt-in to validate that the PR
43
+ # title matches a single commit to avoid confusion.
44
+ validateSingleCommitMatchesPrTitle: true
@@ -0,0 +1,53 @@
1
+ name: pre-commit
2
+
3
+ # Runs the same hooks contributors run locally. Without this, the hooks are
4
+ # optional in practice: anyone who has not run `pre-commit install`, or who
5
+ # commits with --no-verify, bypasses every check in the harness.
6
+
7
+ on:
8
+ pull_request:
9
+ # No `types:` defaults to [opened, synchronize, reopened], which excludes
10
+ # `edited` — fired when a PR's base branch is changed (e.g. retargeting a
11
+ # stacked branch onto main after its base merges), leaving this check
12
+ # stale against the old base until something else pushes a new commit.
13
+ types: [opened, reopened, edited, synchronize]
14
+ push:
15
+ branches: [main]
16
+
17
+ # `main` pushes group by ref rather than PR number, and are never cancelled: a
18
+ # superseded push would leave trunk with no green run against its head commit.
19
+ concurrency:
20
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
21
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
22
+
23
+ permissions:
24
+ contents: read
25
+
26
+ jobs:
27
+ pre-commit:
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v7
31
+ - uses: actions/setup-python@v7
32
+ with:
33
+ python-version: "3.14"
34
+ # The pyrefly hook shells out to uv so the checker sees the project's
35
+ # resolved dependencies, so uv has to be on PATH here too. setup-uv
36
+ # stopped publishing floating major tags after v7, so a bare v10 404s.
37
+ - uses: astral-sh/setup-uv@v10.3.0
38
+ with:
39
+ enable-cache: true
40
+ # --locked rather than --frozen: --frozen installs from the lock without
41
+ # checking it against pyproject.toml, so a dependency change that was never
42
+ # re-locked passes CI green.
43
+ - run: uv sync --locked
44
+ # Pinned so a new pre-commit release cannot change a CI result on its own;
45
+ # bump in step with what contributors install locally.
46
+ - run: python -m pip install pre-commit==4.6.2
47
+ # Reuse the built hook environments across runs; keyed on the hook config
48
+ # so it invalidates when a hook or its version changes.
49
+ - uses: actions/cache@v6
50
+ with:
51
+ path: ~/.cache/pre-commit
52
+ key: pre-commit-${{ runner.os }}-py3.14-${{ hashFiles('.pre-commit-config.yaml') }}
53
+ - run: pre-commit run --all-files --show-diff-on-failure
@@ -0,0 +1,59 @@
1
+ name: release-please
2
+
3
+ # Maintains an open release PR off main: it accumulates the Conventional Commits
4
+ # since the last release, and merging it tags the version and cuts the GitHub
5
+ # release. The publish job then uploads the tagged build to PyPI.
6
+
7
+ on:
8
+ push:
9
+ branches: [main]
10
+
11
+ # The App token below does all the work, so GITHUB_TOKEN is left with nothing.
12
+ permissions: {}
13
+
14
+ jobs:
15
+ release-please:
16
+ runs-on: ubuntu-latest
17
+ outputs:
18
+ release_created: ${{ steps.release.outputs.release_created }}
19
+ tag_name: ${{ steps.release.outputs.tag_name }}
20
+ steps:
21
+ # A release PR opened with GITHUB_TOKEN triggers no workflows, so the
22
+ # checks the ruleset requires would never report on it and it could never
23
+ # merge. No owner or repositories input, so the token covers this
24
+ # repository only; the permission-* set is release-please's documented
25
+ # minimum, and without it the token inherits every permission the
26
+ # installation holds. README "Repository settings" covers the App setup.
27
+ - uses: actions/create-github-app-token@v3
28
+ id: app-token
29
+ with:
30
+ client-id: ${{ vars.RELEASE_BOT_CLIENT_ID }}
31
+ private-key: ${{ secrets.RELEASE_BOT_PRIVATE_KEY }}
32
+ permission-contents: write
33
+ permission-issues: write
34
+ permission-pull-requests: write
35
+
36
+ - uses: googleapis/release-please-action@v5
37
+ id: release
38
+ with:
39
+ token: ${{ steps.app-token.outputs.token }}
40
+ config-file: release-please-config.json
41
+ manifest-file: .release-please-manifest.json
42
+
43
+ # PyPI trusted publishing is registered against this file name and the `pypi` environment.
44
+ publish:
45
+ needs: release-please
46
+ if: needs.release-please.outputs.release_created == 'true'
47
+ runs-on: ubuntu-latest
48
+ environment: pypi
49
+ permissions:
50
+ contents: read
51
+ id-token: write
52
+ steps:
53
+ - uses: actions/checkout@v7
54
+ with:
55
+ ref: ${{ needs.release-please.outputs.tag_name }}
56
+ persist-credentials: false
57
+ - uses: astral-sh/setup-uv@v10.3.0
58
+ - run: uv build
59
+ - uses: pypa/gh-action-pypi-publish@v1.14.2
@@ -0,0 +1,41 @@
1
+ name: tests
2
+
3
+ on:
4
+ pull_request:
5
+ # Default types exclude `edited`, so a retargeted PR keeps a stale result.
6
+ types: [opened, reopened, edited, synchronize]
7
+ push:
8
+ branches: [main]
9
+
10
+ # `main` pushes are never cancelled: a superseded one would leave trunk with no
11
+ # green run against its head commit.
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
14
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ # The job id is the status check context ruleset_payload() requires in
21
+ # scripts/bootstrap_repo.py; renaming it blocks every pull request.
22
+ pytest:
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v7
26
+ # setup-uv stopped publishing floating major tags after v7, so v10 404s.
27
+ - uses: astral-sh/setup-uv@v10.3.0
28
+ with:
29
+ enable-cache: true
30
+ # --frozen would install from a lockfile that no longer matches pyproject.
31
+ - run: uv sync --locked
32
+ - run: uv run --no-sync pytest
33
+ # The default swallows an upload failure, leaving Codecov reporting a
34
+ # stale commit.
35
+ - uses: codecov/codecov-action@v7
36
+ with:
37
+ # `files` adds to what the search finds rather than replacing it.
38
+ files: coverage.xml
39
+ disable_search: true
40
+ fail_ci_if_error: true
41
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,29 @@
1
+ # OS / editor cruft
2
+ .DS_Store
3
+ *.swp
4
+
5
+ # Local secrets
6
+ .env
7
+
8
+ # Local git worktrees
9
+ .worktrees/
10
+
11
+ # Claude Code agent worktrees and local state
12
+ .claude/worktrees/
13
+
14
+ # Python bytecode
15
+ __pycache__/
16
+ *.py[cod]
17
+
18
+ # Python build output
19
+ dist/
20
+ *.egg-info/
21
+
22
+ # Python environment and tool caches
23
+ .venv/
24
+ .pytest_cache/
25
+ .ruff_cache/
26
+
27
+ # Coverage output, written by every `uv run pytest`
28
+ .coverage
29
+ coverage.xml
@@ -0,0 +1,7 @@
1
+ {
2
+ // 100 to match .mdformat.toml's wrap. Tables and code blocks can't be
3
+ // rewrapped, so they're exempt.
4
+ "MD013": { "line_length": 100, "tables": false, "code_blocks": false },
5
+ "MD033": false, // inline HTML is fine
6
+ "MD041": false // first line need not be a top-level heading
7
+ }
@@ -0,0 +1,4 @@
1
+ node_modules/
2
+ .git/
3
+ .claude/
4
+ CHANGELOG.md
@@ -0,0 +1,5 @@
1
+ # mdformat configuration — https://mdformat.readthedocs.io
2
+ # Read by the pre-commit hook, editor integrations, and manual `mdformat .` runs.
3
+
4
+ wrap = 100 # wrap prose at 100 columns
5
+ end_of_line = "lf"
@@ -0,0 +1,115 @@
1
+ # See https://pre-commit.com for usage and hook docs.
2
+ # Update pinned revs with: pre-commit autoupdate
3
+
4
+ default_install_hook_types: [pre-commit, commit-msg]
5
+
6
+ repos:
7
+ - repo: https://github.com/pre-commit/pre-commit-hooks
8
+ rev: v6.0.0
9
+ hooks:
10
+ - id: trailing-whitespace
11
+ args: [--markdown-linebreak-ext=md] # keep 2-space hard line breaks in .md
12
+ - id: end-of-file-fixer
13
+ - id: check-yaml
14
+ - id: check-merge-conflict
15
+ - id: check-added-large-files
16
+ - id: mixed-line-ending
17
+ args: [--fix=lf]
18
+
19
+ - repo: https://github.com/hukkin/mdformat
20
+ rev: 1.0.0
21
+ hooks:
22
+ - id: mdformat
23
+ # release-please owns CHANGELOG.md and rewrites it in its own format on
24
+ # every release, so formatting it here just starts a tug of war.
25
+ # (^|/) rather than ^ so a monorepo releasing per package keeps its
26
+ # apps/*/CHANGELOG.md and libs/*/CHANGELOG.md excluded too.
27
+ exclude: (^|/)CHANGELOG\.md$
28
+ additional_dependencies:
29
+ - mdformat-gfm
30
+ - mdformat-footnote
31
+ - mdformat-frontmatter # leave YAML front matter (skill SKILL.md, etc.) untouched
32
+
33
+ - repo: https://github.com/igorshubovych/markdownlint-cli
34
+ rev: v0.49.1
35
+ hooks:
36
+ - id: markdownlint
37
+ exclude: (^|/)CHANGELOG\.md$
38
+ args: ["--config", ".markdownlint.jsonc"]
39
+
40
+ - repo: https://github.com/rhysd/actionlint
41
+ rev: v1.7.12
42
+ hooks:
43
+ # The plain id builds from source rather than pulling a Docker image or
44
+ # expecting a preinstalled binary; the CI job installs only Python.
45
+ # Go pinned to the version betterleaks already downloads, so the two
46
+ # hooks share one cached toolchain.
47
+ - id: actionlint
48
+ language_version: "1.27.0"
49
+
50
+ - repo: https://github.com/astral-sh/ruff-pre-commit
51
+ rev: v0.16.7
52
+ hooks:
53
+ # --fix writes the fixes and still fails the commit, so stage them and
54
+ # commit again.
55
+ - id: ruff-check
56
+ args: [--fix]
57
+ # types_or narrowed: the upstream hook also claims markdown at this rev, and
58
+ # Ruff reformats Python blocks inside .md. mdformat owns Markdown here, and
59
+ # two formatters on one file is the tug of war CHANGELOG.md already shows.
60
+ - id: ruff-format
61
+ types_or: [python, pyi]
62
+
63
+ - repo: local
64
+ hooks:
65
+ # Pyrefly ships no .pre-commit-hooks.yaml, so this is a local hook. It runs
66
+ # through uv so the checker sees the project's resolved dependencies.
67
+ # --locked because a bare `uv run` rewrites uv.lock in place when it is
68
+ # stale, leaving a tracked file modified as a side effect of committing.
69
+ # src scopes the check past scripts/ and tests/ -- see pyproject.toml.
70
+ - id: pyrefly
71
+ name: pyrefly
72
+ entry: uv run --locked pyrefly check src
73
+ language: system
74
+ types: [python]
75
+ pass_filenames: false # the checker needs the project, not the staged files
76
+
77
+ - repo: https://github.com/commitizen-tools/commitizen
78
+ rev: v4.18.0
79
+ hooks:
80
+ # -l measures the whole first line, type and scope included, and ignores
81
+ # the body, which is exactly the section 2.1 rule. Overriding args
82
+ # replaces the hook's shipped defaults, so --allow-abort is repeated here,
83
+ # and --commit-msg-file stays last because pre-commit appends the message
84
+ # filename after the configured args.
85
+ - id: commitizen
86
+ stages: [commit-msg]
87
+ args: [--allow-abort, --message-length-limit, "72", --commit-msg-file]
88
+
89
+ - repo: https://github.com/betterleaks/betterleaks
90
+ rev: v1.8.1
91
+ hooks:
92
+ # Reports without writing, so nothing is left modified and unstaged.
93
+ # .betterleaks.toml holds what the repository treats as benign.
94
+ # language_version so every machine builds the same scanner.
95
+ - id: betterleaks
96
+ language_version: "1.27.0"
97
+
98
+ - repo: local
99
+ hooks:
100
+ # The --apply path writes real repository settings, so a fake gh is the
101
+ # only place it gets exercised. Runs on any scripts/ change, not just the
102
+ # test file, since the script is what the assertions are about.
103
+ - id: bootstrap-repo-tests
104
+ name: bootstrap_repo tests
105
+ entry: python3 -m unittest discover -s scripts -t scripts
106
+ language: system
107
+ pass_filenames: false
108
+ files: ^scripts/.*\.py$
109
+
110
+ - repo: https://github.com/shellcheck-py/shellcheck-py
111
+ rev: v0.11.0.1-1
112
+ hooks:
113
+ # shellcheck-py ships the binary as a wheel, so this needs no system
114
+ # shellcheck -- the CI job installs only Python.
115
+ - id: shellcheck
@@ -0,0 +1,8 @@
1
+ - id: adr-check
2
+ name: adr-check
3
+ description: Check the ADRs in docs/adr against the ADR rules, without comparing with main
4
+ entry: adr-check
5
+ language: python
6
+ language_version: python3.14 # the package needs it, and pre-commit's own Python may be older
7
+ files: ^docs/adr/
8
+ pass_filenames: false # the check reads the whole directory, including the other ADRs
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.1.0"
3
+ }