changes-roller 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 (63) hide show
  1. changes_roller-0.1.0/.bandit +17 -0
  2. changes_roller-0.1.0/.claude/settings.local.json +35 -0
  3. changes_roller-0.1.0/.editorconfig +46 -0
  4. changes_roller-0.1.0/.gitattributes +56 -0
  5. changes_roller-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +121 -0
  6. changes_roller-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. changes_roller-0.1.0/.github/ISSUE_TEMPLATE/documentation.yml +101 -0
  8. changes_roller-0.1.0/.github/ISSUE_TEMPLATE/feature_request.yml +112 -0
  9. changes_roller-0.1.0/.github/PYPI_TRUSTED_PUBLISHER_SETUP.md +200 -0
  10. changes_roller-0.1.0/.github/dependabot.yml +87 -0
  11. changes_roller-0.1.0/.github/pull_request_template.md +118 -0
  12. changes_roller-0.1.0/.github/workflows/README.md +372 -0
  13. changes_roller-0.1.0/.github/workflows/ci.yml +134 -0
  14. changes_roller-0.1.0/.github/workflows/release.yml +98 -0
  15. changes_roller-0.1.0/.github/workflows/security.yml +63 -0
  16. changes_roller-0.1.0/.gitignore +207 -0
  17. changes_roller-0.1.0/.pre-commit-config.yaml +89 -0
  18. changes_roller-0.1.0/.readthedocs.yaml +38 -0
  19. changes_roller-0.1.0/CHANGELOG.md +44 -0
  20. changes_roller-0.1.0/CODE_OF_CONDUCT.md +132 -0
  21. changes_roller-0.1.0/CONTRIBUTING.md +1012 -0
  22. changes_roller-0.1.0/LICENSE +201 -0
  23. changes_roller-0.1.0/PKG-INFO +331 -0
  24. changes_roller-0.1.0/README.md +282 -0
  25. changes_roller-0.1.0/SECURITY.md +73 -0
  26. changes_roller-0.1.0/SPECIFICATION.md +441 -0
  27. changes_roller-0.1.0/USAGE.md +503 -0
  28. changes_roller-0.1.0/docs/Makefile +33 -0
  29. changes_roller-0.1.0/docs/changelog.md +1 -0
  30. changes_roller-0.1.0/docs/code-of-conduct.md +1 -0
  31. changes_roller-0.1.0/docs/conf.py +157 -0
  32. changes_roller-0.1.0/docs/configuration.md +327 -0
  33. changes_roller-0.1.0/docs/contributing.md +1 -0
  34. changes_roller-0.1.0/docs/examples.md +424 -0
  35. changes_roller-0.1.0/docs/index.rst +104 -0
  36. changes_roller-0.1.0/docs/installation.md +149 -0
  37. changes_roller-0.1.0/docs/overview.md +51 -0
  38. changes_roller-0.1.0/docs/quick-start.md +133 -0
  39. changes_roller-0.1.0/docs/requirements.txt +15 -0
  40. changes_roller-0.1.0/docs/security.md +1 -0
  41. changes_roller-0.1.0/docs/specification.md +1 -0
  42. changes_roller-0.1.0/docs/usage.md +1 -0
  43. changes_roller-0.1.0/examples/dependency-update/README.md +33 -0
  44. changes_roller-0.1.0/examples/dependency-update/patch.sh +15 -0
  45. changes_roller-0.1.0/examples/dependency-update/series.ini +33 -0
  46. changes_roller-0.1.0/pyproject.toml +189 -0
  47. changes_roller-0.1.0/roller/__init__.py +6 -0
  48. changes_roller-0.1.0/roller/cli.py +277 -0
  49. changes_roller-0.1.0/roller/config.py +128 -0
  50. changes_roller-0.1.0/roller/executor.py +331 -0
  51. changes_roller-0.1.0/roller/reporter.py +58 -0
  52. changes_roller-0.1.0/roller/repository.py +252 -0
  53. changes_roller-0.1.0/roller/workspace.py +38 -0
  54. changes_roller-0.1.0/tests/README.md +163 -0
  55. changes_roller-0.1.0/tests/__init__.py +1 -0
  56. changes_roller-0.1.0/tests/conftest.py +91 -0
  57. changes_roller-0.1.0/tests/test_cli.py +322 -0
  58. changes_roller-0.1.0/tests/test_config.py +338 -0
  59. changes_roller-0.1.0/tests/test_executor.py +425 -0
  60. changes_roller-0.1.0/tests/test_integration.py +289 -0
  61. changes_roller-0.1.0/tests/test_reporter.py +180 -0
  62. changes_roller-0.1.0/tests/test_repository.py +480 -0
  63. changes_roller-0.1.0/tests/test_workspace.py +122 -0
@@ -0,0 +1,17 @@
1
+ # Bandit configuration for changes-roller
2
+ # These warnings are intentional for this Git automation tool
3
+
4
+ # Exclude test directories
5
+ exclude_dirs:
6
+ - /tests/
7
+
8
+ # Skip checks:
9
+ # - B101: assert is OK for runtime validation
10
+ # - B404/B603/B607: subprocess and git commands are core functionality
11
+ # - B602: shell=True is intentional for run_command (executes user patch scripts)
12
+ skips:
13
+ - B101
14
+ - B404
15
+ - B603
16
+ - B607
17
+ - B602
@@ -0,0 +1,35 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(ruff check:*)",
5
+ "Bash(ruff format:*)",
6
+ "Bash(bandit:*)",
7
+ "Bash(mypy:*)",
8
+ "Bash(gh issue view:*)",
9
+ "Bash(xrandr:*)",
10
+ "Bash(python -m pytest:*)",
11
+ "Bash(gh issue list:*)",
12
+ "Bash(gh issue edit:*)",
13
+ "Bash(pre-commit install:*)",
14
+ "Bash(pre-commit run:*)",
15
+ "Bash(pytest:*)",
16
+ "Bash(pre-commit validate-config:*)",
17
+ "Bash(git add:*)",
18
+ "Bash(gh issue create:*)",
19
+ "Bash(python3:*)",
20
+ "Bash(pip index:*)",
21
+ "Bash(grep:*)",
22
+ "Bash(gh pr view:*)",
23
+ "Bash(gh pr diff:*)",
24
+ "Bash(gh label:*)",
25
+ "Bash(gh pr edit:*)",
26
+ "Bash(gh pr comment:*)",
27
+ "Bash(gh pr merge:*)",
28
+ "Bash(gh pr checks:*)",
29
+ "Bash(gh pr list:*)",
30
+ "WebSearch",
31
+ "Bash(ln:*)",
32
+ "Bash(sphinx-build:*)"
33
+ ]
34
+ }
35
+ }
@@ -0,0 +1,46 @@
1
+ # EditorConfig is awesome: https://EditorConfig.org
2
+
3
+ # Top-most EditorConfig file
4
+ root = true
5
+
6
+ # All files
7
+ [*]
8
+ charset = utf-8
9
+ end_of_line = lf
10
+ insert_final_newline = true
11
+ trim_trailing_whitespace = true
12
+
13
+ # Python files
14
+ [*.py]
15
+ indent_style = space
16
+ indent_size = 4
17
+ max_line_length = 88
18
+
19
+ # YAML files
20
+ [*.{yml,yaml}]
21
+ indent_style = space
22
+ indent_size = 2
23
+
24
+ # TOML files
25
+ [*.toml]
26
+ indent_style = space
27
+ indent_size = 2
28
+
29
+ # JSON files
30
+ [*.json]
31
+ indent_style = space
32
+ indent_size = 2
33
+
34
+ # Markdown files
35
+ [*.md]
36
+ trim_trailing_whitespace = false
37
+ max_line_length = off
38
+
39
+ # Shell scripts
40
+ [*.sh]
41
+ indent_style = space
42
+ indent_size = 2
43
+
44
+ # Makefile
45
+ [Makefile]
46
+ indent_style = tab
@@ -0,0 +1,56 @@
1
+ # Auto detect text files and normalize line endings to LF
2
+ * text=auto eol=lf
3
+
4
+ # Source code
5
+ *.py text diff=python
6
+ *.sh text eol=lf
7
+
8
+ # Configuration files
9
+ *.yml text
10
+ *.yaml text
11
+ *.toml text
12
+ *.json text
13
+ *.ini text
14
+ *.cfg text
15
+
16
+ # Documentation
17
+ *.md text diff=markdown
18
+ *.txt text
19
+ *.rst text
20
+
21
+ # Git files
22
+ .gitignore text
23
+ .gitattributes text
24
+
25
+ # GitHub files
26
+ .github/**/* text
27
+
28
+ # Binary files
29
+ *.pyc binary
30
+ *.pyo binary
31
+ *.pyd binary
32
+ *.so binary
33
+ *.dylib binary
34
+ *.dll binary
35
+ *.exe binary
36
+ *.png binary
37
+ *.jpg binary
38
+ *.jpeg binary
39
+ *.gif binary
40
+ *.ico binary
41
+ *.pdf binary
42
+ *.zip binary
43
+ *.tar binary
44
+ *.gz binary
45
+ *.bz2 binary
46
+ *.7z binary
47
+
48
+ # Archives
49
+ *.tar.* binary
50
+
51
+ # Fonts
52
+ *.woff binary
53
+ *.woff2 binary
54
+ *.ttf binary
55
+ *.otf binary
56
+ *.eot binary
@@ -0,0 +1,121 @@
1
+ name: Bug Report
2
+ description: Report a bug or unexpected behavior
3
+ title: "[Bug]: "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for taking the time to report a bug! Please fill out the information below to help us identify and fix the issue.
10
+
11
+ - type: textarea
12
+ id: description
13
+ attributes:
14
+ label: Bug Description
15
+ description: A clear and concise description of what the bug is.
16
+ placeholder: Tell us what went wrong...
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: reproduction
22
+ attributes:
23
+ label: Steps to Reproduce
24
+ description: Detailed steps to reproduce the behavior.
25
+ placeholder: |
26
+ 1. Run command '...'
27
+ 2. With configuration '...'
28
+ 3. See error
29
+ value: |
30
+ 1.
31
+ 2.
32
+ 3.
33
+ validations:
34
+ required: true
35
+
36
+ - type: textarea
37
+ id: expected
38
+ attributes:
39
+ label: Expected Behavior
40
+ description: What did you expect to happen?
41
+ placeholder: Describe the expected outcome...
42
+ validations:
43
+ required: true
44
+
45
+ - type: textarea
46
+ id: actual
47
+ attributes:
48
+ label: Actual Behavior
49
+ description: What actually happened? Include error messages and stack traces.
50
+ placeholder: Paste error messages and relevant output...
51
+ render: shell
52
+ validations:
53
+ required: true
54
+
55
+ - type: input
56
+ id: version
57
+ attributes:
58
+ label: changes-roller Version
59
+ description: What version of changes-roller are you using?
60
+ placeholder: "e.g., 0.1.0 or output of 'pip show changes-roller'"
61
+ validations:
62
+ required: true
63
+
64
+ - type: input
65
+ id: python-version
66
+ attributes:
67
+ label: Python Version
68
+ description: What version of Python are you using?
69
+ placeholder: "e.g., 3.12.0 or output of 'python --version'"
70
+ validations:
71
+ required: true
72
+
73
+ - type: input
74
+ id: os
75
+ attributes:
76
+ label: Operating System
77
+ description: What operating system are you using?
78
+ placeholder: "e.g., Ubuntu 22.04, macOS 14.0, Windows 11"
79
+ validations:
80
+ required: true
81
+
82
+ - type: input
83
+ id: git-version
84
+ attributes:
85
+ label: Git Version
86
+ description: What version of Git are you using?
87
+ placeholder: "e.g., 2.40.0 or output of 'git --version'"
88
+ validations:
89
+ required: false
90
+
91
+ - type: textarea
92
+ id: configuration
93
+ attributes:
94
+ label: Configuration File
95
+ description: If relevant, include your configuration file (redact sensitive information).
96
+ placeholder: Paste your .ini configuration file...
97
+ render: ini
98
+ validations:
99
+ required: false
100
+
101
+ - type: textarea
102
+ id: logs
103
+ attributes:
104
+ label: Additional Context
105
+ description: Add any other context, logs, or screenshots about the problem.
106
+ placeholder: Any additional information that might help...
107
+ validations:
108
+ required: false
109
+
110
+ - type: checkboxes
111
+ id: checklist
112
+ attributes:
113
+ label: Pre-submission Checklist
114
+ description: Please verify the following before submitting.
115
+ options:
116
+ - label: I have searched existing issues to avoid duplicates
117
+ required: true
118
+ - label: I am using the latest version of changes-roller
119
+ required: false
120
+ - label: I have included all required information above
121
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Question or Discussion
4
+ url: https://github.com/k-pavlo/changes-roller/discussions
5
+ about: Ask questions or discuss ideas with the community
6
+ - name: Security Vulnerability
7
+ url: https://github.com/k-pavlo/changes-roller/security/advisories/new
8
+ about: Report a security vulnerability privately (see SECURITY.md)
@@ -0,0 +1,101 @@
1
+ name: Documentation Improvement
2
+ description: Suggest improvements to documentation
3
+ title: "[Docs]: "
4
+ labels: ["documentation"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for helping improve our documentation! Clear documentation helps everyone.
10
+
11
+ - type: dropdown
12
+ id: doc-type
13
+ attributes:
14
+ label: Documentation Type
15
+ description: What type of documentation needs improvement?
16
+ options:
17
+ - README.md
18
+ - USAGE.md (User Guide)
19
+ - SPECIFICATION.md
20
+ - CONTRIBUTING.md
21
+ - Code comments or docstrings
22
+ - API documentation
23
+ - Examples
24
+ - Other
25
+ validations:
26
+ required: true
27
+
28
+ - type: input
29
+ id: location
30
+ attributes:
31
+ label: Location
32
+ description: Where in the documentation is the issue?
33
+ placeholder: "e.g., README.md line 42, USAGE.md 'Branch Switching' section"
34
+ validations:
35
+ required: true
36
+
37
+ - type: textarea
38
+ id: issue
39
+ attributes:
40
+ label: Issue with Current Documentation
41
+ description: What is unclear, missing, incorrect, or could be improved?
42
+ placeholder: Describe what's wrong with the current documentation...
43
+ validations:
44
+ required: true
45
+
46
+ - type: textarea
47
+ id: suggestion
48
+ attributes:
49
+ label: Suggested Improvement
50
+ description: How should the documentation be improved?
51
+ placeholder: |
52
+ Describe or provide the improved documentation...
53
+
54
+ If providing specific text, please format it appropriately:
55
+ ```markdown
56
+ Your suggested documentation text here...
57
+ ```
58
+ validations:
59
+ required: true
60
+
61
+ - type: textarea
62
+ id: context
63
+ attributes:
64
+ label: Additional Context
65
+ description: Why is this improvement important? Who would benefit?
66
+ placeholder: |
67
+ Example: "New users get confused by this section..."
68
+ Example: "This feature isn't documented at all..."
69
+ validations:
70
+ required: false
71
+
72
+ - type: checkboxes
73
+ id: doc-areas
74
+ attributes:
75
+ label: Related Areas
76
+ description: Which areas of documentation might also need updates?
77
+ options:
78
+ - label: README.md
79
+ - label: USAGE.md
80
+ - label: SPECIFICATION.md
81
+ - label: CONTRIBUTING.md
82
+ - label: Code comments
83
+ - label: Examples
84
+ - label: CLI help text
85
+
86
+ - type: checkboxes
87
+ id: contribution
88
+ attributes:
89
+ label: Contribution
90
+ options:
91
+ - label: I would be willing to submit a PR with this documentation improvement
92
+
93
+ - type: checkboxes
94
+ id: checklist
95
+ attributes:
96
+ label: Pre-submission Checklist
97
+ options:
98
+ - label: I have checked that this documentation issue doesn't already have an open issue
99
+ required: true
100
+ - label: I have verified the current state of the documentation
101
+ required: true
@@ -0,0 +1,112 @@
1
+ name: Feature Request
2
+ description: Suggest a new feature or enhancement
3
+ title: "[Feature]: "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for suggesting a new feature! Please provide as much detail as possible to help us understand your request.
10
+
11
+ - type: textarea
12
+ id: feature-description
13
+ attributes:
14
+ label: Feature Description
15
+ description: A clear and concise description of the feature you'd like to see.
16
+ placeholder: Describe the feature...
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: problem
22
+ attributes:
23
+ label: Problem or Use Case
24
+ description: What problem does this feature solve? What use case does it address?
25
+ placeholder: |
26
+ Is your feature request related to a problem? Please describe.
27
+ Example: I'm always frustrated when...
28
+ validations:
29
+ required: true
30
+
31
+ - type: textarea
32
+ id: proposed-solution
33
+ attributes:
34
+ label: Proposed Solution
35
+ description: How would you like this feature to work? Describe the desired behavior.
36
+ placeholder: |
37
+ Describe how you envision this feature working...
38
+ Include examples of commands, configuration, or usage.
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: alternatives
44
+ attributes:
45
+ label: Alternatives Considered
46
+ description: Have you considered any alternative solutions or workarounds?
47
+ placeholder: Describe alternatives you've considered...
48
+ validations:
49
+ required: false
50
+
51
+ - type: textarea
52
+ id: examples
53
+ attributes:
54
+ label: Usage Examples
55
+ description: Provide concrete examples of how this feature would be used.
56
+ placeholder: |
57
+ Example command usage:
58
+ ```bash
59
+ roller create --new-option value
60
+ ```
61
+
62
+ Example configuration:
63
+ ```ini
64
+ [SERIE]
65
+ new_setting = value
66
+ ```
67
+ render: markdown
68
+ validations:
69
+ required: false
70
+
71
+ - type: dropdown
72
+ id: impact
73
+ attributes:
74
+ label: Impact
75
+ description: How would this feature impact your workflow?
76
+ options:
77
+ - Critical - Blocks major use cases
78
+ - High - Significantly improves workflow
79
+ - Medium - Nice to have enhancement
80
+ - Low - Minor convenience
81
+ validations:
82
+ required: true
83
+
84
+ - type: textarea
85
+ id: additional-context
86
+ attributes:
87
+ label: Additional Context
88
+ description: Add any other context, mockups, or screenshots about the feature request.
89
+ placeholder: Any additional information...
90
+ validations:
91
+ required: false
92
+
93
+ - type: checkboxes
94
+ id: contribution
95
+ attributes:
96
+ label: Contribution
97
+ description: Would you be willing to contribute to this feature?
98
+ options:
99
+ - label: I would be willing to implement this feature
100
+ - label: I would be willing to help test this feature
101
+ - label: I can provide additional requirements and feedback
102
+
103
+ - type: checkboxes
104
+ id: checklist
105
+ attributes:
106
+ label: Pre-submission Checklist
107
+ description: Please verify the following before submitting.
108
+ options:
109
+ - label: I have searched existing issues and feature requests to avoid duplicates
110
+ required: true
111
+ - label: This feature aligns with the project's goals (multi-repo patch automation)
112
+ required: true
@@ -0,0 +1,200 @@
1
+ # PyPI Trusted Publisher Setup
2
+
3
+ This document provides instructions for configuring PyPI Trusted Publishers (OIDC-based publishing) for the changes-roller project.
4
+
5
+ ## Overview
6
+
7
+ **Trusted Publishers** is PyPI's recommended secure method for automated package publishing. It uses OpenID Connect (OIDC) to authenticate GitHub Actions workflows without requiring API tokens.
8
+
9
+ ## Benefits
10
+
11
+ - ✅ No API tokens to store or manage
12
+ - ✅ No secrets in GitHub repository
13
+ - ✅ Automatic token rotation
14
+ - ✅ Scoped permissions (specific repo + workflow only)
15
+ - ✅ Complete audit trail on PyPI
16
+
17
+ ## Prerequisites
18
+
19
+ Before setting up trusted publishing:
20
+
21
+ 1. The package must be registered on PyPI (upload at least one version manually first)
22
+ 2. You must be a maintainer/owner of the package on PyPI
23
+ 3. You must have access to the GitHub repository
24
+
25
+ ## Step 1: Initial Package Registration
26
+
27
+ If this is the first time publishing the package, you must upload it manually first:
28
+
29
+ ```bash
30
+ # Build the package
31
+ pip install --upgrade build hatchling
32
+ python -m build
33
+
34
+ # Upload to PyPI (you'll need your PyPI credentials)
35
+ pip install --upgrade twine
36
+ twine upload dist/*
37
+ ```
38
+
39
+ After this initial upload, you won't need to use tokens anymore.
40
+
41
+ ## Step 2: Configure Trusted Publisher on PyPI
42
+
43
+ ### 2.1 Access PyPI Project Settings
44
+
45
+ 1. Go to https://pypi.org/manage/project/changes-roller/settings/
46
+ 2. Log in with your PyPI account (must have maintainer access)
47
+ 3. Scroll to the **Publishing** section
48
+
49
+ ### 2.2 Add Pending Publisher
50
+
51
+ Click **"Add a new pending publisher"** and fill in:
52
+
53
+ | Field | Value |
54
+ | --------------------- | ---------------- |
55
+ | **PyPI Project Name** | `changes-roller` |
56
+ | **Owner** | `k-pavlo` |
57
+ | **Repository name** | `changes-roller` |
58
+ | **Workflow filename** | `release.yml` |
59
+ | **Environment name** | `release` |
60
+
61
+ ### 2.3 Save Configuration
62
+
63
+ Click **"Add"** to save the trusted publisher configuration.
64
+
65
+ The publisher will show as "pending" until the first successful publish from GitHub Actions.
66
+
67
+ ## Step 3: Configure GitHub Environment (Optional but Recommended)
68
+
69
+ Add extra protection by configuring the `release` environment in GitHub:
70
+
71
+ 1. Go to https://github.com/k-pavlo/changes-roller/settings/environments
72
+ 2. Click **"New environment"**
73
+ 3. Name it: `release`
74
+ 4. Configure protection rules:
75
+ - ✅ **Required reviewers**: Add maintainers (optional)
76
+ - ✅ **Deployment branches**: Select "Selected branches" → Add `main`
77
+ 5. Click **"Save protection rules"**
78
+
79
+ This ensures releases can only be triggered from the `main` branch and optionally require manual approval.
80
+
81
+ ## Step 4: Test the Setup
82
+
83
+ Create a test release to verify the configuration:
84
+
85
+ ```bash
86
+ # 1. Ensure you're on main branch
87
+ git checkout main
88
+ git pull origin main
89
+
90
+ # 2. Bump version (or create a test tag manually)
91
+ cz bump
92
+
93
+ # 3. Push the tag
94
+ git push origin --tags
95
+
96
+ # 4. Monitor GitHub Actions
97
+ # Go to: https://github.com/k-pavlo/changes-roller/actions
98
+ # Watch the "Release to PyPI" workflow
99
+ ```
100
+
101
+ ### Expected Workflow Steps
102
+
103
+ 1. ✅ **Build** - Package is built with hatchling
104
+ 2. ✅ **Publish to PyPI** - Authenticates via OIDC and uploads
105
+ 3. ✅ **Create GitHub Release** - Release is created with notes
106
+
107
+ ### Verification
108
+
109
+ After workflow completes:
110
+
111
+ - **PyPI**: Visit https://pypi.org/project/changes-roller/ and verify new version is listed
112
+ - **GitHub**: Visit https://github.com/k-pavlo/changes-roller/releases and verify release is created
113
+ - **Install**: Test `pip install changes-roller==<version>`
114
+
115
+ ## Troubleshooting
116
+
117
+ ### "Trusted publisher validation failed"
118
+
119
+ **Problem**: PyPI cannot verify the OIDC token from GitHub Actions.
120
+
121
+ **Solutions**:
122
+
123
+ 1. **Check PyPI configuration**:
124
+ - Verify owner name matches: `k-pavlo`
125
+ - Verify repo name matches: `changes-roller`
126
+ - Verify workflow name matches: `release.yml`
127
+ - Verify environment name matches: `release`
128
+
129
+ 2. **Check GitHub workflow**:
130
+ - Verify workflow file is named `.github/workflows/release.yml`
131
+ - Verify workflow uses `environment: release`
132
+ - Verify workflow has `permissions: id-token: write`
133
+
134
+ 3. **Check workflow trigger**:
135
+ - Trusted publishing only works when triggered by tag push matching the pattern
136
+ - Manual workflow runs won't work if they don't set the environment correctly
137
+
138
+ ### "This filename has already been used"
139
+
140
+ **Problem**: Trying to re-upload the same version to PyPI.
141
+
142
+ **Solution**: PyPI doesn't allow re-uploading the same version. Bump to a new version.
143
+
144
+ ### "Publisher is pending"
145
+
146
+ **Problem**: Trusted publisher shows as "pending" on PyPI.
147
+
148
+ **Solution**: This is normal before the first successful publish. After the first successful automated publish from GitHub Actions, it will change to "active".
149
+
150
+ ### "403 Forbidden" when publishing
151
+
152
+ **Problem**: Workflow doesn't have permission to publish.
153
+
154
+ **Solutions**:
155
+
156
+ 1. Verify the PyPI project name matches exactly: `changes-roller`
157
+ 2. Ensure the workflow is running from the correct repository
158
+ 3. Check that the workflow has the correct environment configured
159
+ 4. Verify `id-token: write` permission is set
160
+
161
+ ## Additional Resources
162
+
163
+ - [PyPI Trusted Publishers Documentation](https://docs.pypi.org/trusted-publishers/)
164
+ - [GitHub OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
165
+ - [PyPA Publishing Action](https://github.com/pypa/gh-action-pypi-publish)
166
+
167
+ ## Support
168
+
169
+ If you encounter issues:
170
+
171
+ 1. Check the workflow logs in GitHub Actions
172
+ 2. Review the PyPI trusted publisher configuration
173
+ 3. Consult the resources above
174
+ 4. Open an issue on the repository for help
175
+
176
+ ## Migration from Token-based Publishing
177
+
178
+ If you previously used API tokens:
179
+
180
+ 1. Remove the `PYPI_API_TOKEN` secret from GitHub repository settings
181
+ 2. Configure trusted publisher as described above
182
+ 3. The workflow already supports trusted publishing (no changes needed)
183
+ 4. Previous token-based uploads are still valid and don't need to be redone
184
+
185
+ ## Security Notes
186
+
187
+ - **No secrets required**: Trusted publishing uses OIDC, not static tokens
188
+ - **Automatic rotation**: Authentication tokens are ephemeral (valid only for the workflow run)
189
+ - **Audit trail**: All publishes are logged on PyPI with full context
190
+ - **Scoped access**: Publisher can only publish to the specific package from the specific repo/workflow
191
+ - **Revocable**: Publisher can be removed from PyPI settings at any time
192
+
193
+ ## Maintenance
194
+
195
+ The trusted publisher configuration should not need regular maintenance. However:
196
+
197
+ - If you rename the repository, update the trusted publisher configuration
198
+ - If you rename the workflow file, update the trusted publisher configuration
199
+ - If you change the environment name, update both PyPI and the workflow
200
+ - Review active publishers periodically in PyPI settings