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.
- adr_check-0.1.0/.betterleaks.toml +24 -0
- adr_check-0.1.0/.editorconfig +19 -0
- adr_check-0.1.0/.gitattributes +5 -0
- adr_check-0.1.0/.github/CODEOWNERS +6 -0
- adr_check-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +17 -0
- adr_check-0.1.0/.github/ISSUE_TEMPLATE/config.yml +3 -0
- adr_check-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +17 -0
- adr_check-0.1.0/.github/actionlint.yaml +11 -0
- adr_check-0.1.0/.github/dependabot.yml +26 -0
- adr_check-0.1.0/.github/pull_request_template.md +34 -0
- adr_check-0.1.0/.github/workflows/lint-pr.yml +44 -0
- adr_check-0.1.0/.github/workflows/pre-commit.yml +53 -0
- adr_check-0.1.0/.github/workflows/release-please.yml +59 -0
- adr_check-0.1.0/.github/workflows/tests.yml +41 -0
- adr_check-0.1.0/.gitignore +29 -0
- adr_check-0.1.0/.markdownlint.jsonc +7 -0
- adr_check-0.1.0/.markdownlintignore +4 -0
- adr_check-0.1.0/.mdformat.toml +5 -0
- adr_check-0.1.0/.pre-commit-config.yaml +115 -0
- adr_check-0.1.0/.pre-commit-hooks.yaml +8 -0
- adr_check-0.1.0/.release-please-manifest.json +3 -0
- adr_check-0.1.0/AGENTS.md +120 -0
- adr_check-0.1.0/CHANGELOG.md +10 -0
- adr_check-0.1.0/CLAUDE.md +6 -0
- adr_check-0.1.0/LICENSE +21 -0
- adr_check-0.1.0/PKG-INFO +278 -0
- adr_check-0.1.0/README.md +262 -0
- adr_check-0.1.0/SECURITY.md +28 -0
- adr_check-0.1.0/action.yml +56 -0
- adr_check-0.1.0/codecov.yml +16 -0
- adr_check-0.1.0/pyproject.toml +125 -0
- adr_check-0.1.0/release-please-config.json +16 -0
- adr_check-0.1.0/scripts/bootstrap_repo.py +327 -0
- adr_check-0.1.0/scripts/test_bootstrap_repo.py +261 -0
- adr_check-0.1.0/src/adr_check/__init__.py +1 -0
- adr_check-0.1.0/src/adr_check/adr.py +334 -0
- adr_check-0.1.0/src/adr_check/ci.py +234 -0
- adr_check-0.1.0/src/adr_check/cli.py +87 -0
- adr_check-0.1.0/src/adr_check/py.typed +0 -0
- adr_check-0.1.0/tests/adrs.py +52 -0
- adr_check-0.1.0/tests/data/0001-record-architecture-decisions.md +63 -0
- adr_check-0.1.0/tests/data/0002-use-the-template.md +70 -0
- adr_check-0.1.0/tests/gitrepo.py +66 -0
- adr_check-0.1.0/tests/test_action.py +92 -0
- adr_check-0.1.0/tests/test_adr.py +445 -0
- adr_check-0.1.0/tests/test_ci.py +540 -0
- adr_check-0.1.0/tests/test_cli.py +205 -0
- 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,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,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,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
|