zizmor 0.8.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.

Potentially problematic release.


This version of zizmor might be problematic. Click here for more details.

Files changed (85) hide show
  1. zizmor-0.8.0/.github/FUNDING.yml +2 -0
  2. zizmor-0.8.0/.github/ISSUE_TEMPLATE/bug-report.yml +77 -0
  3. zizmor-0.8.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. zizmor-0.8.0/.github/ISSUE_TEMPLATE/feature-request.yml +52 -0
  5. zizmor-0.8.0/.github/dependabot.yml +19 -0
  6. zizmor-0.8.0/.github/release.yml +29 -0
  7. zizmor-0.8.0/.github/workflows/ci.yml +36 -0
  8. zizmor-0.8.0/.github/workflows/pypi.yml +174 -0
  9. zizmor-0.8.0/.github/workflows/release.yml +19 -0
  10. zizmor-0.8.0/.github/workflows/site.yml +51 -0
  11. zizmor-0.8.0/.github/workflows/zizmor.yml +33 -0
  12. zizmor-0.8.0/.gitignore +9 -0
  13. zizmor-0.8.0/.pre-commit-hooks.yaml +6 -0
  14. zizmor-0.8.0/CONTRIBUTING.md +84 -0
  15. zizmor-0.8.0/Cargo.lock +2480 -0
  16. zizmor-0.8.0/Cargo.toml +59 -0
  17. zizmor-0.8.0/LICENSE +21 -0
  18. zizmor-0.8.0/Makefile +22 -0
  19. zizmor-0.8.0/PKG-INFO +63 -0
  20. zizmor-0.8.0/README.md +50 -0
  21. zizmor-0.8.0/docs/assets/favicon48x48.png +0 -0
  22. zizmor-0.8.0/docs/assets/rainbow.svg +1 -0
  23. zizmor-0.8.0/docs/assets/zizmor-demo.gif +0 -0
  24. zizmor-0.8.0/docs/audits.md +694 -0
  25. zizmor-0.8.0/docs/configuration.md +77 -0
  26. zizmor-0.8.0/docs/development.md +258 -0
  27. zizmor-0.8.0/docs/index.md +25 -0
  28. zizmor-0.8.0/docs/installation.md +66 -0
  29. zizmor-0.8.0/docs/magiclink.css +107 -0
  30. zizmor-0.8.0/docs/quickstart.md +73 -0
  31. zizmor-0.8.0/docs/snippets/help.txt +40 -0
  32. zizmor-0.8.0/docs/usage.md +363 -0
  33. zizmor-0.8.0/mkdocs.yml +103 -0
  34. zizmor-0.8.0/pyproject.toml +6 -0
  35. zizmor-0.8.0/site-requirements.txt +2 -0
  36. zizmor-0.8.0/src/audit/artipacked.rs +146 -0
  37. zizmor-0.8.0/src/audit/dangerous_triggers.rs +54 -0
  38. zizmor-0.8.0/src/audit/excessive_permissions.rs +162 -0
  39. zizmor-0.8.0/src/audit/github_env.rs +206 -0
  40. zizmor-0.8.0/src/audit/hardcoded_container_credentials.rs +107 -0
  41. zizmor-0.8.0/src/audit/impostor_commit.rs +174 -0
  42. zizmor-0.8.0/src/audit/insecure_commands.rs +94 -0
  43. zizmor-0.8.0/src/audit/known_vulnerable_actions.rs +163 -0
  44. zizmor-0.8.0/src/audit/mod.rs +136 -0
  45. zizmor-0.8.0/src/audit/ref_confusion.rs +124 -0
  46. zizmor-0.8.0/src/audit/self_hosted_runner.rs +126 -0
  47. zizmor-0.8.0/src/audit/template_injection.rs +369 -0
  48. zizmor-0.8.0/src/audit/unpinned_uses.rs +55 -0
  49. zizmor-0.8.0/src/audit/use_trusted_publishing.rs +133 -0
  50. zizmor-0.8.0/src/config.rs +206 -0
  51. zizmor-0.8.0/src/expr/expr.pest +83 -0
  52. zizmor-0.8.0/src/expr/mod.rs +490 -0
  53. zizmor-0.8.0/src/finding/locate.rs +65 -0
  54. zizmor-0.8.0/src/finding/mod.rs +405 -0
  55. zizmor-0.8.0/src/github_api.rs +319 -0
  56. zizmor-0.8.0/src/main.rs +304 -0
  57. zizmor-0.8.0/src/models.rs +760 -0
  58. zizmor-0.8.0/src/registry.rs +324 -0
  59. zizmor-0.8.0/src/render.rs +155 -0
  60. zizmor-0.8.0/src/sarif.rs +104 -0
  61. zizmor-0.8.0/src/state.rs +63 -0
  62. zizmor-0.8.0/src/utils.rs +159 -0
  63. zizmor-0.8.0/tests/acceptance.rs +254 -0
  64. zizmor-0.8.0/tests/common.rs +12 -0
  65. zizmor-0.8.0/tests/snapshot.rs +170 -0
  66. zizmor-0.8.0/tests/snapshots/snapshot__artipacked-2.snap +14 -0
  67. zizmor-0.8.0/tests/snapshots/snapshot__artipacked.snap +25 -0
  68. zizmor-0.8.0/tests/snapshots/snapshot__cant_retrieve.snap +7 -0
  69. zizmor-0.8.0/tests/snapshots/snapshot__conflicting_online_options-2.snap +10 -0
  70. zizmor-0.8.0/tests/snapshots/snapshot__conflicting_online_options-3.snap +10 -0
  71. zizmor-0.8.0/tests/snapshots/snapshot__conflicting_online_options.snap +10 -0
  72. zizmor-0.8.0/tests/snapshots/snapshot__self_hosted-2.snap +6 -0
  73. zizmor-0.8.0/tests/snapshots/snapshot__self_hosted.snap +14 -0
  74. zizmor-0.8.0/tests/snapshots/snapshot__unpinned_uses-2.snap +38 -0
  75. zizmor-0.8.0/tests/snapshots/snapshot__unpinned_uses.snap +46 -0
  76. zizmor-0.8.0/tests/test-data/artipacked.yml +20 -0
  77. zizmor-0.8.0/tests/test-data/excessive-permissions.yml +11 -0
  78. zizmor-0.8.0/tests/test-data/github_env.yml +14 -0
  79. zizmor-0.8.0/tests/test-data/hardcoded-credentials.yml +19 -0
  80. zizmor-0.8.0/tests/test-data/inlined-ignores.yml +33 -0
  81. zizmor-0.8.0/tests/test-data/insecure-commands.yml +11 -0
  82. zizmor-0.8.0/tests/test-data/self-hosted.yml +11 -0
  83. zizmor-0.8.0/tests/test-data/template-injection.yml +16 -0
  84. zizmor-0.8.0/tests/test-data/unpinned-uses.yml +31 -0
  85. zizmor-0.8.0/tests/test-data/use-trusted-publishing.yml +15 -0
@@ -0,0 +1,2 @@
1
+ github: woodruffw
2
+ thanks_dev: u/gh/woodruffw
@@ -0,0 +1,77 @@
1
+ name: Bug Report
2
+ description: File a bug report.
3
+ title: "[BUG]: "
4
+ labels:
5
+ - bug
6
+ - triage
7
+ body:
8
+ - type: markdown
9
+ attributes:
10
+ value: |
11
+ Thank you for taking the time to fill out this bug report!
12
+
13
+ Please read the following parts of this template carefully.
14
+ Invalid or incomplete submissions take longer to triage,
15
+ and may be given a lower priority or closed outright
16
+ if not actionable.
17
+
18
+ - type: checkboxes
19
+ attributes:
20
+ label: Pre-submission checks
21
+ description: |
22
+ By submitting this issue, you affirm that you've satisfied the
23
+ following conditions.
24
+ options:
25
+ - label: >-
26
+ I am **not** filing a feature request. These should be filed via
27
+ the feature request form instead.
28
+ required: true
29
+ - label: >-
30
+ I have looked through the
31
+ [open issues](https://github.com/woodruffw/zizmor/issues?q=is%3Aissue+is%3Aopen+)
32
+ for a duplicate report.
33
+ required: true
34
+
35
+ - type: textarea
36
+ attributes:
37
+ label: Expected behavior
38
+ description: A clear and concise description of what you expected to happen.
39
+ placeholder: |
40
+ I expected `zizmor ...` to do X, Y, and Z.
41
+ validations:
42
+ required: true
43
+
44
+ - type: textarea
45
+ attributes:
46
+ label: Actual behavior
47
+ description: A clear and concise description of what actually happened.
48
+ placeholder: |
49
+ Instead of doing X, Y, and Z, `zizmor ...` produced the following error: ...
50
+ validations:
51
+ required: true
52
+
53
+ - type: textarea
54
+ attributes:
55
+ label: Reproduction steps
56
+ description: A step-by-step list of actions that we can take to reproduce the actual behavior.
57
+ placeholder: |
58
+ 1. Do this
59
+ 2. Do that
60
+ 3. Do another thing
61
+ validations:
62
+ required: true
63
+
64
+ - type: textarea
65
+ attributes:
66
+ label: Logs
67
+ description: |
68
+ If applicable, please paste any logs or console errors here.
69
+
70
+ If you can re-run the command that produced the error, run it with
71
+ `--verbose` and paste the full verbose logs here.
72
+ render: plain text
73
+
74
+ - type: textarea
75
+ attributes:
76
+ label: Additional context
77
+ description: Add any other additional context about the problem here.
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Discussions Forum
4
+ url: https://github.com/woodruffw/zizmor/discussions
5
+ about: Please ask and answer questions here.
6
+ - name: Security Reports
7
+ url: https://github.com/woodruffw/zizmor/security/advisories
8
+ about: Please report potential security vulnerabilities here.
@@ -0,0 +1,52 @@
1
+ name: Feature request
2
+ description: Suggest an idea or enhancement for zizmor
3
+ title: "Feature: "
4
+ labels:
5
+ - enhancement
6
+ body:
7
+ - type: markdown
8
+ attributes:
9
+ value: |
10
+ Thank for for making a `zizmor` feature request!
11
+
12
+ Please read the following parts of this form carefully.
13
+ Invalid or incomplete submissions take longer to triage,
14
+ and may be given a lower priority or closed outright
15
+ if not actionable.
16
+
17
+ - type: checkboxes
18
+ attributes:
19
+ label: Pre-submission checks
20
+ description: |
21
+ By submitting this issue, you affirm that you've satisfied the following conditions.
22
+ options:
23
+ - label: >-
24
+ I am **not** reporting a bug (crash, false positive/negative, etc).
25
+ These must be filed via the bug report template.
26
+ required: true
27
+ - label: >-
28
+ I have looked through the open issues for a duplicate request.
29
+ required: true
30
+
31
+ - type: textarea
32
+ attributes:
33
+ label: What's the problem this feature will solve?
34
+ description: |
35
+ A clear and concise description of the problem.
36
+ placeholder: |
37
+ I'm always frustrated when ...
38
+ validations:
39
+ required: true
40
+
41
+ - type: textarea
42
+ attributes:
43
+ label: Describe the solution you'd like
44
+ description: A clear and concise description of what you want to happen.
45
+ validations:
46
+ required: true
47
+
48
+ - type: textarea
49
+ attributes:
50
+ label: Additional context
51
+ description: |
52
+ Any additional context, screenshots, or other material about the feature request.
@@ -0,0 +1,19 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: cargo
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ groups:
8
+ cargo:
9
+ patterns:
10
+ - "*"
11
+
12
+ - package-ecosystem: github-actions
13
+ directory: /
14
+ schedule:
15
+ interval: weekly
16
+ groups:
17
+ github-actions:
18
+ patterns:
19
+ - "*"
@@ -0,0 +1,29 @@
1
+ changelog:
2
+ exclude:
3
+ labels:
4
+ - tests
5
+ - chore
6
+ - no-changelog
7
+ authors:
8
+ - dependabot
9
+
10
+ categories:
11
+ - title: New Features 🌈
12
+ labels:
13
+ - enhancement
14
+ - new-audit
15
+ - cli
16
+
17
+ - title: Bug Fixes 🐛
18
+ labels:
19
+ - bugfix
20
+ - false-negative
21
+ - false-positive
22
+
23
+ - title: Performance Improvements 🚄
24
+ labels:
25
+ - performance
26
+
27
+ - title: Documentation Improvements 📖
28
+ labels:
29
+ - documentation
@@ -0,0 +1,36 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
14
+ with:
15
+ persist-credentials: false
16
+
17
+ - name: Format
18
+ run: cargo fmt && git diff --exit-code
19
+
20
+ - name: Lint
21
+ run: cargo clippy -- -D warnings
22
+
23
+ test:
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
27
+ with:
28
+ persist-credentials: false
29
+
30
+ - name: Test
31
+ run: cargo test
32
+
33
+ - name: Test snippets
34
+ run: |
35
+ make snippets
36
+ git diff --exit-code
@@ -0,0 +1,174 @@
1
+ name: zizmor wheel builds for PyPI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - '*'
9
+ pull_request:
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ linux:
17
+ runs-on: ${{ matrix.platform.runner }}
18
+ strategy:
19
+ matrix:
20
+ platform:
21
+ - runner: ubuntu-22.04
22
+ target: x86_64
23
+ - runner: ubuntu-22.04
24
+ target: x86
25
+ # FUBAR
26
+ # - runner: ubuntu-22.04
27
+ # target: aarch64
28
+ - runner: ubuntu-22.04
29
+ target: armv7
30
+ - runner: ubuntu-22.04
31
+ target: s390x
32
+ - runner: ubuntu-22.04
33
+ target: ppc64le
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ with:
37
+ persist-credentials: false
38
+ - name: Build wheels
39
+ uses: PyO3/maturin-action@v1
40
+ with:
41
+ target: ${{ matrix.platform.target }}
42
+ args: --release --out dist
43
+ sccache: 'true'
44
+ manylinux: auto
45
+ - name: Upload wheels
46
+ uses: actions/upload-artifact@v4
47
+ with:
48
+ name: wheels-linux-${{ matrix.platform.target }}
49
+ path: dist
50
+
51
+ musllinux:
52
+ runs-on: ${{ matrix.platform.runner }}
53
+ strategy:
54
+ matrix:
55
+ platform:
56
+ - runner: ubuntu-22.04
57
+ target: x86_64
58
+ - runner: ubuntu-22.04
59
+ target: x86
60
+ - runner: ubuntu-22.04
61
+ target: aarch64
62
+ - runner: ubuntu-22.04
63
+ target: armv7
64
+ steps:
65
+ - uses: actions/checkout@v4
66
+ with:
67
+ persist-credentials: false
68
+ - name: Build wheels
69
+ uses: PyO3/maturin-action@v1
70
+ with:
71
+ target: ${{ matrix.platform.target }}
72
+ args: --release --out dist
73
+ sccache: 'true'
74
+ manylinux: musllinux_1_2
75
+ - name: Upload wheels
76
+ uses: actions/upload-artifact@v4
77
+ with:
78
+ name: wheels-musllinux-${{ matrix.platform.target }}
79
+ path: dist
80
+
81
+ windows:
82
+ runs-on: ${{ matrix.platform.runner }}
83
+ strategy:
84
+ matrix:
85
+ platform:
86
+ - runner: windows-latest
87
+ target: x64
88
+ - runner: windows-latest
89
+ target: x86
90
+ steps:
91
+ - uses: actions/checkout@v4
92
+ with:
93
+ persist-credentials: false
94
+ - name: Build wheels
95
+ uses: PyO3/maturin-action@v1
96
+ with:
97
+ target: ${{ matrix.platform.target }}
98
+ args: --release --out dist
99
+ sccache: 'true'
100
+ - name: Upload wheels
101
+ uses: actions/upload-artifact@v4
102
+ with:
103
+ name: wheels-windows-${{ matrix.platform.target }}
104
+ path: dist
105
+
106
+ macos:
107
+ runs-on: ${{ matrix.platform.runner }}
108
+ strategy:
109
+ matrix:
110
+ platform:
111
+ - runner: macos-13
112
+ target: x86_64
113
+ - runner: macos-14
114
+ target: aarch64
115
+ steps:
116
+ - uses: actions/checkout@v4
117
+ with:
118
+ persist-credentials: false
119
+ - name: Build wheels
120
+ uses: PyO3/maturin-action@v1
121
+ with:
122
+ target: ${{ matrix.platform.target }}
123
+ args: --release --out dist
124
+ sccache: 'true'
125
+ - name: Upload wheels
126
+ uses: actions/upload-artifact@v4
127
+ with:
128
+ name: wheels-macos-${{ matrix.platform.target }}
129
+ path: dist
130
+
131
+ sdist:
132
+ runs-on: ubuntu-latest
133
+ steps:
134
+ - uses: actions/checkout@v4
135
+ with:
136
+ persist-credentials: false
137
+ - name: Build sdist
138
+ uses: PyO3/maturin-action@v1
139
+ with:
140
+ command: sdist
141
+ args: --out dist
142
+ - name: Upload sdist
143
+ uses: actions/upload-artifact@v4
144
+ with:
145
+ name: wheels-sdist
146
+ path: dist
147
+
148
+ release:
149
+ name: Release
150
+ runs-on: ubuntu-latest
151
+ environment:
152
+ name: pypi
153
+ url: https://pypi.org/p/zizmor
154
+ if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
155
+ needs: [linux, musllinux, windows, macos, sdist]
156
+ permissions:
157
+ # Use to sign the release artifacts
158
+ id-token: write
159
+ # Used to upload release artifacts
160
+ contents: write
161
+ # Used to generate artifact attestation
162
+ attestations: write
163
+ steps:
164
+ - uses: actions/download-artifact@v4
165
+ - name: Generate artifact attestation
166
+ uses: actions/attest-build-provenance@v1
167
+ with:
168
+ subject-path: 'wheels-*/*'
169
+ - name: Publish to PyPI
170
+ if: ${{ startsWith(github.ref, 'refs/tags/') }}
171
+ uses: PyO3/maturin-action@v1
172
+ with:
173
+ command: upload
174
+ args: --non-interactive --skip-existing wheels-*/*
@@ -0,0 +1,19 @@
1
+ on:
2
+ release:
3
+ types:
4
+ - published
5
+
6
+ name: release
7
+
8
+ jobs:
9
+ crates:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
13
+ with:
14
+ persist-credentials: false
15
+
16
+ - name: publish to crates.io
17
+ run: cargo publish
18
+ env:
19
+ CARGO_REGISTRY_TOKEN: "${{ secrets.CARGO_REGISTRY_TOKEN }}"
@@ -0,0 +1,51 @@
1
+ name: Deploy zizmor site
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - site-staging
8
+
9
+ workflow_dispatch:
10
+
11
+ concurrency:
12
+ group: "pages"
13
+ cancel-in-progress: false
14
+
15
+ permissions: {}
16
+
17
+ jobs:
18
+ deploy:
19
+ permissions:
20
+ contents: read
21
+ pages: write
22
+ id-token: write
23
+ environment:
24
+ name: github-pages
25
+ url: ${{ steps.deployment.outputs.page_url }}
26
+
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
30
+ with:
31
+ persist-credentials: false
32
+
33
+ - name: Install the latest version of uv
34
+ uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v3
35
+
36
+ - name: build site
37
+ run: make site
38
+
39
+ - name: Setup Pages
40
+ if: github.repository_owner == 'woodruffw'
41
+ uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
42
+
43
+ - name: Upload artifact
44
+ uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
45
+ with:
46
+ path: site_html
47
+
48
+ - name: Deploy to GitHub Pages
49
+ if: github.repository_owner == 'woodruffw'
50
+ id: deployment
51
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
@@ -0,0 +1,33 @@
1
+ name: GitHub Actions Security Analysis with zizmor 🌈
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ pull_request:
7
+ branches: ["*"]
8
+
9
+ jobs:
10
+ zizmor:
11
+ name: zizmor latest via Cargo
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ security-events: write
16
+ steps:
17
+ - name: Checkout repository
18
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
19
+ with:
20
+ persist-credentials: false
21
+ - name: Setup Rust
22
+ uses: actions-rust-lang/setup-rust-toolchain@11df97af8e8102fd60b60a77dfbf58d40cd843b8 # v1
23
+ - name: Get zizmor
24
+ run: cargo install zizmor
25
+ - name: Run zizmor 🌈
26
+ run: zizmor --format sarif . > results.sarif
27
+ env:
28
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
29
+ - name: Upload SARIF file
30
+ uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
31
+ with:
32
+ sarif_file: results.sarif
33
+ category: zizmor
@@ -0,0 +1,9 @@
1
+ /target
2
+
3
+ # website artifacts
4
+ /site_html
5
+ .cache
6
+
7
+ # IDEs / Editors
8
+ .idea
9
+ .DS_STORE
@@ -0,0 +1,6 @@
1
+ - id: zizmor
2
+ name: zizmor
3
+ description: 'Find security issues in GitHub Actions CI/CD setups'
4
+ language: rust
5
+ files: \.github/workflows/.*\.yml$
6
+ entry: zizmor
@@ -0,0 +1,84 @@
1
+ # Contributing to `zizmor`
2
+
3
+ Thank you for your interest in contributing to `zizmor`!
4
+
5
+ This is intended to be a "high-level" guide with some suggestions
6
+ for ways to contribute. Once you've picked a contribution idea,
7
+ please see our [development docs]
8
+ for concrete guidance on specific development tasks and style prescriptions.
9
+
10
+ ## How to contribute
11
+
12
+ Here's a short list of steps you can follow to contribute:
13
+
14
+ 1. *Figure out what you want to contribute.* See the
15
+ [contribution ideas](#contribution-ideas) section below if you're looking
16
+ for ideas!
17
+ 2. *File or reply to an issue, if appropriate.* Some contributions require
18
+ new issues (like new bugs), while others involve an existing issue
19
+ (like known documentation defects). Others don't require an issue at all,
20
+ like small typo fixes. In general, if you aren't sure, *error on the side
21
+ of making or replying to an issue* — it helps maintain shared
22
+ development context.
23
+ 3. *Hack away.* Once you know what you're working on, refer to our
24
+ [development docs] for help with specific development tasks. And don't be
25
+ afraid to ask for help!
26
+
27
+ ## Contribution ideas
28
+
29
+ Here are some ways that you can contribute to `zizmor`. These aren't the only
30
+ ways; they're just for inspiration.
31
+
32
+ ### Good first issues
33
+
34
+ We use the ["good first issue"] label to track issues that we think are
35
+ (somewhat) easy and/or straightforward, making them good choices for an
36
+ early contribution.
37
+
38
+ To work on one of these, **please leave a comment** on its issue before opening
39
+ a pull request to make sure nobody else duplicates your work!
40
+
41
+ ["good first issue"]: https://github.com/woodruffw/zizmor/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22
42
+
43
+ ### Writing documentation
44
+
45
+ One of the best ways to help us with `zizmor` is to help us improve our
46
+ documentation!
47
+
48
+ Here are some things we could use help with:
49
+
50
+ * Improving our [CLI usage recipes](https://woodruffw.github.io/zizmor/usage/).
51
+ * Improving the detail in our
52
+ [audit documentation pages](https://woodruffw.github.io/zizmor/audits/).
53
+ * Improving our internal (Rust API) documentation, especially in conjunction
54
+ with more unit tests.
55
+
56
+ More generally, see [issues labeled with `documentation`] for a potential
57
+ list of documentation efforts to contribute on.
58
+
59
+ [issues labeled with `documentation`]: https://github.com/woodruffw/zizmor/issues?q=is%3Aissue+is%3Aopen+label%3Adocumentation
60
+
61
+ ### Writing unit tests
62
+
63
+ We can always use more unit tests! Pick a part of the Rust codebase and
64
+ start testing.
65
+
66
+ Keep the cardinal rule of unit testing in mind: a unit test must test
67
+ **a single unit** of behavior. If it tests more than one unit, then
68
+ consider making it an integration test instead.
69
+
70
+ ### Reducing false positives/negatives in audits
71
+
72
+ Static analysis is inherently imprecise, and `zizmor` is no exception.
73
+
74
+ We track imprecision bugs with the ["false positive"] and ["false negative"]
75
+ labels. These can sometimes be tricky to address, so we recommend
76
+ (but don't require) leaving an explanatory comment on the issue before
77
+ beginning a pull request.
78
+
79
+ ["false positive"]: https://github.com/woodruffw/zizmor/issues?q=is%3Aopen+label%3Afalse-positive
80
+
81
+ ["false negative"]: https://github.com/woodruffw/zizmor/issues?q=is%3Aopen+label%3Afalse-negative
82
+
83
+ [development docs]: https://woodruffw.github.io/zizmor/development/
84
+