jirapi 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 (140) hide show
  1. jirapi-0.1.0/.claude/settings.json +46 -0
  2. jirapi-0.1.0/.github/FUNDING.yml +1 -0
  3. jirapi-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +75 -0
  4. jirapi-0.1.0/.github/pull_request_template.md +24 -0
  5. jirapi-0.1.0/.github/workflows/ci.yml +128 -0
  6. jirapi-0.1.0/.github/workflows/claude-code.yml +54 -0
  7. jirapi-0.1.0/.github/workflows/claude-issue-code.yml +83 -0
  8. jirapi-0.1.0/.github/workflows/claude-issue-triage.yml +53 -0
  9. jirapi-0.1.0/.github/workflows/claude-pull_request-code_review.yml +37 -0
  10. jirapi-0.1.0/.gitignore +32 -0
  11. jirapi-0.1.0/AGENTS.md +149 -0
  12. jirapi-0.1.0/CHANGELOG.md +36 -0
  13. jirapi-0.1.0/LICENSE +21 -0
  14. jirapi-0.1.0/PKG-INFO +240 -0
  15. jirapi-0.1.0/README.md +212 -0
  16. jirapi-0.1.0/Taskfile.yml +94 -0
  17. jirapi-0.1.0/docs/.gitkeep +0 -0
  18. jirapi-0.1.0/docs/jira-cloud-api-openapi.json +1 -0
  19. jirapi-0.1.0/jirapi/__init__.py +32 -0
  20. jirapi-0.1.0/jirapi/_base_client.py +188 -0
  21. jirapi-0.1.0/jirapi/_resource.py +34 -0
  22. jirapi-0.1.0/jirapi/_types.py +17 -0
  23. jirapi-0.1.0/jirapi/client.py +1425 -0
  24. jirapi-0.1.0/jirapi/exceptions.py +109 -0
  25. jirapi-0.1.0/jirapi/models/__init__.py +20935 -0
  26. jirapi-0.1.0/jirapi/pagination.py +259 -0
  27. jirapi-0.1.0/jirapi/py.typed +0 -0
  28. jirapi-0.1.0/jirapi/resources/__init__.py +351 -0
  29. jirapi-0.1.0/jirapi/resources/announcement_banner.py +42 -0
  30. jirapi-0.1.0/jirapi/resources/app_data_policies.py +36 -0
  31. jirapi-0.1.0/jirapi/resources/app_migration.py +79 -0
  32. jirapi-0.1.0/jirapi/resources/app_properties.py +112 -0
  33. jirapi-0.1.0/jirapi/resources/application_roles.py +34 -0
  34. jirapi-0.1.0/jirapi/resources/audit_records.py +46 -0
  35. jirapi-0.1.0/jirapi/resources/avatars.py +139 -0
  36. jirapi-0.1.0/jirapi/resources/classification_levels.py +32 -0
  37. jirapi-0.1.0/jirapi/resources/dashboards.py +412 -0
  38. jirapi-0.1.0/jirapi/resources/dynamic_modules.py +58 -0
  39. jirapi-0.1.0/jirapi/resources/field_schemes.py +328 -0
  40. jirapi-0.1.0/jirapi/resources/filter_sharing.py +96 -0
  41. jirapi-0.1.0/jirapi/resources/filters.py +320 -0
  42. jirapi-0.1.0/jirapi/resources/group_and_user_picker.py +74 -0
  43. jirapi-0.1.0/jirapi/resources/groups.py +293 -0
  44. jirapi-0.1.0/jirapi/resources/issue_attachments.py +136 -0
  45. jirapi-0.1.0/jirapi/resources/issue_bulk_operations.py +226 -0
  46. jirapi-0.1.0/jirapi/resources/issue_comment_properties.py +64 -0
  47. jirapi-0.1.0/jirapi/resources/issue_comments.py +192 -0
  48. jirapi-0.1.0/jirapi/resources/issue_custom_field_associations.py +50 -0
  49. jirapi-0.1.0/jirapi/resources/issue_custom_field_configuration_apps.py +163 -0
  50. jirapi-0.1.0/jirapi/resources/issue_custom_field_contexts.py +374 -0
  51. jirapi-0.1.0/jirapi/resources/issue_custom_field_options.py +198 -0
  52. jirapi-0.1.0/jirapi/resources/issue_custom_field_options_apps.py +214 -0
  53. jirapi-0.1.0/jirapi/resources/issue_custom_field_values_apps.py +80 -0
  54. jirapi-0.1.0/jirapi/resources/issue_fields.py +240 -0
  55. jirapi-0.1.0/jirapi/resources/issue_link_types.py +83 -0
  56. jirapi-0.1.0/jirapi/resources/issue_links.py +48 -0
  57. jirapi-0.1.0/jirapi/resources/issue_navigator_settings.py +34 -0
  58. jirapi-0.1.0/jirapi/resources/issue_notification_schemes.py +220 -0
  59. jirapi-0.1.0/jirapi/resources/issue_priorities.py +70 -0
  60. jirapi-0.1.0/jirapi/resources/issue_properties.py +153 -0
  61. jirapi-0.1.0/jirapi/resources/issue_redaction.py +38 -0
  62. jirapi-0.1.0/jirapi/resources/issue_remote_links.py +126 -0
  63. jirapi-0.1.0/jirapi/resources/issue_resolutions.py +152 -0
  64. jirapi-0.1.0/jirapi/resources/issue_search.py +180 -0
  65. jirapi-0.1.0/jirapi/resources/issue_security_level.py +74 -0
  66. jirapi-0.1.0/jirapi/resources/issue_security_schemes.py +427 -0
  67. jirapi-0.1.0/jirapi/resources/issue_type_properties.py +70 -0
  68. jirapi-0.1.0/jirapi/resources/issue_type_schemes.py +266 -0
  69. jirapi-0.1.0/jirapi/resources/issue_type_screen_schemes.py +324 -0
  70. jirapi-0.1.0/jirapi/resources/issue_types.py +124 -0
  71. jirapi-0.1.0/jirapi/resources/issue_votes.py +44 -0
  72. jirapi-0.1.0/jirapi/resources/issue_watchers.py +72 -0
  73. jirapi-0.1.0/jirapi/resources/issue_worklog_properties.py +90 -0
  74. jirapi-0.1.0/jirapi/resources/issue_worklogs.py +398 -0
  75. jirapi-0.1.0/jirapi/resources/issues.py +582 -0
  76. jirapi-0.1.0/jirapi/resources/jira_expressions.py +71 -0
  77. jirapi-0.1.0/jirapi/resources/jira_settings.py +88 -0
  78. jirapi-0.1.0/jirapi/resources/jql.py +156 -0
  79. jirapi-0.1.0/jirapi/resources/jql_functions_apps.py +124 -0
  80. jirapi-0.1.0/jirapi/resources/labels.py +30 -0
  81. jirapi-0.1.0/jirapi/resources/license_metrics.py +50 -0
  82. jirapi-0.1.0/jirapi/resources/migration_of_connect_modules_to_forge.py +32 -0
  83. jirapi-0.1.0/jirapi/resources/myself.py +72 -0
  84. jirapi-0.1.0/jirapi/resources/permission_schemes.py +195 -0
  85. jirapi-0.1.0/jirapi/resources/permissions.py +122 -0
  86. jirapi-0.1.0/jirapi/resources/plans.py +147 -0
  87. jirapi-0.1.0/jirapi/resources/priority_schemes.py +265 -0
  88. jirapi-0.1.0/jirapi/resources/project_avatars.py +87 -0
  89. jirapi-0.1.0/jirapi/resources/project_categories.py +82 -0
  90. jirapi-0.1.0/jirapi/resources/project_classification_levels.py +64 -0
  91. jirapi-0.1.0/jirapi/resources/project_components.py +197 -0
  92. jirapi-0.1.0/jirapi/resources/project_email.py +42 -0
  93. jirapi-0.1.0/jirapi/resources/project_features.py +48 -0
  94. jirapi-0.1.0/jirapi/resources/project_key_and_name_validation.py +58 -0
  95. jirapi-0.1.0/jirapi/resources/project_permission_schemes.py +90 -0
  96. jirapi-0.1.0/jirapi/resources/project_properties.py +70 -0
  97. jirapi-0.1.0/jirapi/resources/project_role_actors.py +144 -0
  98. jirapi-0.1.0/jirapi/resources/project_roles.py +172 -0
  99. jirapi-0.1.0/jirapi/resources/project_templates.py +118 -0
  100. jirapi-0.1.0/jirapi/resources/project_types.py +58 -0
  101. jirapi-0.1.0/jirapi/resources/project_versions.py +264 -0
  102. jirapi-0.1.0/jirapi/resources/projects.py +273 -0
  103. jirapi-0.1.0/jirapi/resources/screen_schemes.py +115 -0
  104. jirapi-0.1.0/jirapi/resources/screen_tab_fields.py +92 -0
  105. jirapi-0.1.0/jirapi/resources/screen_tabs.py +122 -0
  106. jirapi-0.1.0/jirapi/resources/screens.py +165 -0
  107. jirapi-0.1.0/jirapi/resources/server_info.py +24 -0
  108. jirapi-0.1.0/jirapi/resources/service_registry.py +30 -0
  109. jirapi-0.1.0/jirapi/resources/status.py +218 -0
  110. jirapi-0.1.0/jirapi/resources/tasks.py +34 -0
  111. jirapi-0.1.0/jirapi/resources/teams_in_plan.py +162 -0
  112. jirapi-0.1.0/jirapi/resources/time_tracking.py +84 -0
  113. jirapi-0.1.0/jirapi/resources/ui_modifications_apps.py +101 -0
  114. jirapi-0.1.0/jirapi/resources/untagged.py +36 -0
  115. jirapi-0.1.0/jirapi/resources/user_properties.py +142 -0
  116. jirapi-0.1.0/jirapi/resources/user_search.py +398 -0
  117. jirapi-0.1.0/jirapi/resources/users.py +278 -0
  118. jirapi-0.1.0/jirapi/resources/webhooks.py +103 -0
  119. jirapi-0.1.0/jirapi/resources/workflow_scheme_drafts.py +254 -0
  120. jirapi-0.1.0/jirapi/resources/workflow_scheme_project_associations.py +50 -0
  121. jirapi-0.1.0/jirapi/resources/workflow_schemes.py +419 -0
  122. jirapi-0.1.0/jirapi/resources/workflow_status_categories.py +34 -0
  123. jirapi-0.1.0/jirapi/resources/workflow_statuses.py +34 -0
  124. jirapi-0.1.0/jirapi/resources/workflow_transition_rules.py +119 -0
  125. jirapi-0.1.0/jirapi/resources/workflows.py +400 -0
  126. jirapi-0.1.0/pyproject.toml +130 -0
  127. jirapi-0.1.0/renovate.json +46 -0
  128. jirapi-0.1.0/scripts/generate_models.py +184 -0
  129. jirapi-0.1.0/scripts/generate_resources.py +616 -0
  130. jirapi-0.1.0/tests/__init__.py +1 -0
  131. jirapi-0.1.0/tests/unit/__init__.py +1 -0
  132. jirapi-0.1.0/tests/unit/conftest.py +32 -0
  133. jirapi-0.1.0/tests/unit/test_base_client.py +174 -0
  134. jirapi-0.1.0/tests/unit/test_exceptions.py +99 -0
  135. jirapi-0.1.0/tests/unit/test_pagination.py +251 -0
  136. jirapi-0.1.0/tests/unit/test_resources/__init__.py +1 -0
  137. jirapi-0.1.0/tests/unit/test_resources/test_issues.py +85 -0
  138. jirapi-0.1.0/tests/unit/test_resources/test_primitive_returns.py +102 -0
  139. jirapi-0.1.0/tests/unit/test_resources/test_projects.py +83 -0
  140. jirapi-0.1.0/uv.lock +545 -0
@@ -0,0 +1,46 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(uv run ruff:*)",
5
+ "Bash(uv run pytest:*)",
6
+ "Bash(uv sync:*)",
7
+ "Bash(uv run:*)",
8
+ "Bash(uv lock:*)",
9
+ "Bash(uv build:*)",
10
+ "Bash(tree:*)",
11
+ "Bash(ls:*)",
12
+ "Bash(find:*)",
13
+ "Bash(head:*)",
14
+ "Bash(tail:*)",
15
+ "Bash(grep:*)",
16
+ "Bash(gh pr view:*)",
17
+ "Bash(gh pr checks:*)",
18
+ "Bash(gh pr diff:*)",
19
+ "Bash(gh pr list:*)",
20
+ "Bash(python3:*)",
21
+ "Bash(gh api:*)",
22
+ "Bash(task:*)"
23
+ ],
24
+ "deny": [
25
+ "Bash(curl *)",
26
+ "Bash(ssh *)",
27
+ "Read(./.env)",
28
+ "Read(./.env.*)",
29
+ "Read(./secrets/**)"
30
+ ],
31
+ "additionalDirectories": [
32
+ "/tmp"
33
+ ]
34
+ },
35
+ "enabledPlugins": {
36
+ "security-guidance@claude-plugins-official": true,
37
+ "pr-review-toolkit@claude-plugins-official": true,
38
+ "github@claude-plugins-official": true,
39
+ "context7@claude-plugins-official": true,
40
+ "claude-md-management@claude-plugins-official": true,
41
+ "code-review@claude-plugins-official": true,
42
+ "claude-code-setup@claude-plugins-official": true,
43
+ "code-simplifier@claude-plugins-official": true,
44
+ "feature-dev@claude-plugins-official": true
45
+ }
46
+ }
@@ -0,0 +1 @@
1
+ github: [brett-fitz]
@@ -0,0 +1,75 @@
1
+ name: Bug Report
2
+ description: Report a bug in jirapi
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 sections below.
10
+
11
+ - type: textarea
12
+ id: description
13
+ attributes:
14
+ label: Description
15
+ description: A clear and concise description of the bug.
16
+ placeholder: Describe the bug...
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: steps
22
+ attributes:
23
+ label: Steps to reproduce
24
+ description: Steps to reproduce the behavior.
25
+ placeholder: |
26
+ 1. Create a client with ...
27
+ 2. Call ...
28
+ 3. See error
29
+ validations:
30
+ required: true
31
+
32
+ - type: textarea
33
+ id: expected
34
+ attributes:
35
+ label: Expected behavior
36
+ description: What you expected to happen.
37
+ validations:
38
+ required: true
39
+
40
+ - type: textarea
41
+ id: actual
42
+ attributes:
43
+ label: Actual behavior
44
+ description: What actually happened. Include tracebacks if applicable.
45
+ validations:
46
+ required: true
47
+
48
+ - type: dropdown
49
+ id: python-version
50
+ attributes:
51
+ label: Python version
52
+ options:
53
+ - "3.11"
54
+ - "3.12"
55
+ - "3.13"
56
+ - "3.14"
57
+ validations:
58
+ required: true
59
+
60
+ - type: input
61
+ id: jirapi-version
62
+ attributes:
63
+ label: jirapi version
64
+ description: "Output of: python -c \"import jirapi; print(jirapi.__version__)\""
65
+ placeholder: "0.1.0"
66
+ validations:
67
+ required: true
68
+
69
+ - type: textarea
70
+ id: context
71
+ attributes:
72
+ label: Additional context
73
+ description: Any other context, logs, or screenshots.
74
+ validations:
75
+ required: false
@@ -0,0 +1,24 @@
1
+ # Pull Request
2
+
3
+ ## What
4
+
5
+ <!-- Brief description of the change -->
6
+
7
+ ## Why
8
+
9
+ <!-- Motivation or context for the change -->
10
+
11
+ ## Type
12
+
13
+ - [ ] Feature
14
+ - [ ] Bug fix
15
+ - [ ] Refactor
16
+ - [ ] Documentation
17
+ - [ ] CI / CD
18
+ - [ ] Other
19
+
20
+ ## Checklist
21
+
22
+ - [ ] Tests added or updated
23
+ - [ ] `task check` passes (lint + format + tests)
24
+ - [ ] Documentation updated (if applicable)
@@ -0,0 +1,128 @@
1
+ name: ci / lint, test and publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ pull_request:
7
+ branches:
8
+ - main
9
+ paths:
10
+ - '**.py'
11
+ - 'pyproject.toml'
12
+ - 'uv.lock'
13
+ - 'Taskfile.yml'
14
+
15
+ release:
16
+ types: [published]
17
+
18
+ concurrency:
19
+ group: ${{ github.workflow }}-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ permissions:
23
+ contents: read
24
+
25
+ jobs:
26
+
27
+ lint:
28
+ name: ruff
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - name: Clone repository
32
+ uses: actions/checkout@v6
33
+
34
+ - name: Install go-task
35
+ uses: go-task/setup-task@v1
36
+ with:
37
+ version: 3.x
38
+
39
+ - name: Set up UV
40
+ uses: astral-sh/setup-uv@v7
41
+ with:
42
+ enable-cache: true
43
+
44
+ - name: Install dependencies
45
+ run: task setup
46
+
47
+ - name: Run Ruff Check
48
+ run: task lint
49
+
50
+ - name: Run Ruff Format Check
51
+ run: task format:check
52
+
53
+ test:
54
+ name: tests (python ${{ matrix.python }})
55
+ runs-on: ubuntu-latest
56
+ strategy:
57
+ fail-fast: false
58
+ matrix:
59
+ python: ["3.11", "3.12", "3.13", "3.14"]
60
+ permissions:
61
+ pull-requests: write
62
+ contents: write
63
+ steps:
64
+ - name: Clone repository
65
+ uses: actions/checkout@v6
66
+
67
+ - name: Install go-task
68
+ uses: go-task/setup-task@v1
69
+ with:
70
+ version: 3.x
71
+
72
+ - name: Set up UV
73
+ uses: astral-sh/setup-uv@v7
74
+ with:
75
+ enable-cache: true
76
+ python-version: ${{ matrix.python }}
77
+
78
+ - name: Install dependencies
79
+ run: task setup
80
+
81
+ - name: Verify lockfile
82
+ run: task lock:check
83
+
84
+ - name: Run pytest with coverage
85
+ run: task test:ci
86
+
87
+ - name: Generate coverage reports
88
+ run: |
89
+ uv run coverage json
90
+ uv run coverage report
91
+
92
+ - name: Coverage comment
93
+ if: ${{ matrix.python == '3.14' && github.event_name == 'pull_request' }}
94
+ uses: py-cov-action/python-coverage-comment-action@v3
95
+ with:
96
+ GITHUB_TOKEN: ${{ github.token }}
97
+ MINIMUM_GREEN: 70
98
+ MINIMUM_ORANGE: 50
99
+
100
+ - name: Optimize UV cache
101
+ run: uv cache prune --ci
102
+
103
+ publish:
104
+ name: publish to PyPI
105
+ needs: [lint, test]
106
+ if: github.event_name == 'release'
107
+ runs-on: ubuntu-latest
108
+ permissions:
109
+ id-token: write
110
+ environment:
111
+ name: pypi
112
+ url: https://pypi.org/p/jirapi
113
+ steps:
114
+ - name: Clone repository
115
+ uses: actions/checkout@v6
116
+
117
+ - name: Set up UV
118
+ uses: astral-sh/setup-uv@v7
119
+ with:
120
+ enable-cache: true
121
+
122
+ - name: Build package
123
+ run: uv build
124
+
125
+ - name: Publish to PyPI
126
+ run: uv publish
127
+ env:
128
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,54 @@
1
+ name: claude / code
2
+
3
+ on:
4
+ pull_request_review_comment:
5
+ types: [created]
6
+ pull_request_review:
7
+ types: [submitted]
8
+
9
+ jobs:
10
+ claude:
11
+ if: |
12
+ (
13
+ (github.event_name == 'pull_request_review_comment' && github.event.comment.user.login == 'brett-fitz' && contains(github.event.comment.body, '@claude')) ||
14
+ (github.event_name == 'pull_request_review' && github.event.review.user.login == 'brett-fitz' && contains(github.event.review.body, '@claude'))
15
+ )
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read
19
+ pull-requests: read
20
+ issues: read
21
+ id-token: write
22
+ actions: read
23
+ steps:
24
+ - name: Checkout repository
25
+ uses: actions/checkout@v6
26
+ with:
27
+ fetch-depth: 1
28
+
29
+ - name: Set up UV
30
+ uses: astral-sh/setup-uv@v7
31
+ with:
32
+ enable-cache: true
33
+
34
+ - name: Install dependencies
35
+ run: uv sync --all-groups
36
+
37
+ - name: Run Claude Code
38
+ id: claude
39
+ uses: anthropics/claude-code-action@v1
40
+ with:
41
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
42
+ use_commit_signing: true
43
+
44
+ additional_permissions: |
45
+ actions: read
46
+
47
+ claude_args: |
48
+ --model "claude-sonnet-4-6"
49
+ --allowed-tools "Bash(gh issue:*),Bash(gh search:*),Bash(gh pr view:*),Bash(gh pr comment:*),Bash(gh pr list:*),Bash(gh pr create:*),Bash(gh pr update:*)"
50
+
51
+ track_progress: true
52
+
53
+ - name: Optimize UV cache
54
+ run: uv cache prune --ci
@@ -0,0 +1,83 @@
1
+ name: claude / issue / code
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+
7
+ jobs:
8
+ claude:
9
+ if: |
10
+ github.event.comment.user.login == 'brett-fitz' &&
11
+ contains(github.event.comment.body, '@claude')
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ contents: read
15
+ pull-requests: read
16
+ issues: read
17
+ id-token: write
18
+ actions: read
19
+ steps:
20
+ - name: Checkout repository
21
+ uses: actions/checkout@v6
22
+ with:
23
+ fetch-depth: 1
24
+
25
+ - name: Set up UV
26
+ uses: astral-sh/setup-uv@v7
27
+ with:
28
+ enable-cache: true
29
+
30
+ - name: Install dependencies
31
+ run: uv sync --all-groups
32
+
33
+ - name: Run Claude Code
34
+ id: claude
35
+ uses: anthropics/claude-code-action@v1
36
+ with:
37
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
38
+ use_commit_signing: true
39
+
40
+ additional_permissions: |
41
+ actions: read
42
+
43
+ prompt: |
44
+ <task>
45
+ <instructions>
46
+ Review the issue context and user request first. Only complete the user request if you can.
47
+ If you believe the task is too difficult or needs to be broken up, then suggest this.
48
+ If you need to know more about the issue, then ask the user for more information.
49
+ If you create a pull request, provide the issue number in the pull request title.
50
+ e.g. "[#123] Add feature".
51
+ If you create a pull request, be sure to follow .github/pull_request_template.md for
52
+ the pull request template.
53
+ If you make changes to the code, ensure proper pytest coverage is maintained.
54
+ If you make changes to the code, be sure to run the pytests tests and ensure they pass.
55
+ If you make changes to the code, be sure to run the ruff linting, formatting and ensure it passes.
56
+ </instructions>
57
+
58
+ <issue_context>
59
+ REPO: ${{ github.repository }}
60
+ ISSUE NUMBER: ${{ github.event.issue.number }}
61
+ TITLE: ${{ github.event.issue.title }}
62
+ BODY:
63
+ ${{ github.event.issue.body }}
64
+ AUTHOR: ${{ github.event.issue.user.login }}
65
+ COMMENT AUTHOR: ${{ github.event.comment.user.login }}
66
+ </issue_context>
67
+
68
+ <user_request>
69
+ COMMENT: ${{ github.event.comment.body }}
70
+
71
+ Note: If the comment above only contains "@claude" with no other meaningful instructions,
72
+ treat this as a request to "Resolve the issue" based on the issue context provided.
73
+ </user_request>
74
+ </task>
75
+
76
+ claude_args: |
77
+ --model "claude-opus-4-6"
78
+ --allowed-tools "Bash(gh issue:*),Bash(gh search:*),Bash(gh pr view:*),Bash(gh pr comment:*),Bash(gh pr list:*),Bash(gh pr create:*),Bash(gh pr update:*)"
79
+
80
+ track_progress: true
81
+
82
+ - name: Optimize UV cache
83
+ run: uv cache prune --ci
@@ -0,0 +1,53 @@
1
+ name: claude / issue / triage
2
+
3
+ on:
4
+ issues:
5
+ types: [opened]
6
+
7
+ jobs:
8
+ triage:
9
+ if: github.event.issue.user.login == 'brett-fitz'
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ issues: write
13
+ contents: read
14
+ pull-requests: read
15
+ id-token: write
16
+ actions: read
17
+ steps:
18
+ - name: Clone repository
19
+ uses: actions/checkout@v6
20
+
21
+ - uses: anthropics/claude-code-action@v1
22
+ with:
23
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
24
+ prompt: |
25
+ REPO: ${{ github.repository }}
26
+ ISSUE NUMBER: ${{ github.event.issue.number }}
27
+ TITLE: ${{ github.event.issue.title }}
28
+ BODY: ${{ github.event.issue.body }}
29
+ AUTHOR: ${{ github.event.issue.user.login }}
30
+
31
+ Analyze this new issue and perform the following steps:
32
+ 1. Determine if it's a bug report, feature request, or question
33
+ 2. Assess priority (critical, high, medium, low)
34
+ 3. Suggest appropriate labels
35
+ 4. Check if it duplicates existing issues
36
+ 5. Check if it is related to existing issues
37
+ 6. Check if it is dependent on other opened issues
38
+ 7. If it is a bug, triage it but do not resolve it.
39
+ 8. If it is a feature request, do NOT suggest a solution or resolve it.
40
+
41
+ Based on your analysis, add the appropriate labels using:
42
+ `gh issue edit [number] --add-label "label1,label2"`
43
+
44
+ Finally when you are done, post a comment on the issue with the following information:
45
+ - A concise summary of your triage and steps taken.
46
+ - If it appears to be a duplicate, mention the original issue.
47
+ - If the issue relates to another issue, then add a comment "Relates to #<issue number>".
48
+ - If the issue is dependent on another issue, then add a comment "Depends on #<issue number>".
49
+
50
+ REMEMBER: Your job is to triage the issue, not to resolve it.
51
+ claude_args: |
52
+ --model "claude-sonnet-4-6"
53
+ --allowedTools "Bash(gh issue:*),Bash(gh search:*),Bash(gh pr view:*),Bash(gh pr comment:*),Bash(gh pr list:*)"
@@ -0,0 +1,37 @@
1
+ name: claude / pull request / code review
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, ready_for_review, reopened]
6
+
7
+ jobs:
8
+ claude-review:
9
+ if: |
10
+ github.event.pull_request.user.login == 'brett-fitz' ||
11
+ github.event.pull_request.user.login == 'dependabot[bot]' ||
12
+ github.event.pull_request.user.login == 'renovate[bot]'
13
+ runs-on: ubuntu-latest
14
+ permissions:
15
+ contents: read
16
+ pull-requests: read
17
+ issues: read
18
+ id-token: write
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@v6
23
+ with:
24
+ fetch-depth: 1
25
+
26
+ - name: Run Claude Code Review
27
+ id: claude-review
28
+ uses: anthropics/claude-code-action@v1
29
+ with:
30
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
31
+ plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
32
+ plugins: 'code-review@claude-code-plugins'
33
+ prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
34
+ track_progress: true
35
+ allowed_bots: "dependabot[bot],renovate[bot],claude[bot],cursor[bot],copilot[bot]"
36
+ claude_args: |
37
+ --model "claude-opus-4-6"
@@ -0,0 +1,32 @@
1
+ # Mac
2
+ .DS_Store
3
+
4
+ # Byte-compiled / optimized / DLL files
5
+ __pycache__/
6
+ *.py[cod]
7
+ *$py.class
8
+
9
+ # Environments
10
+ .idea/
11
+ .venv/
12
+
13
+ # Distribution / packaging
14
+ dist/
15
+ build/
16
+ *.egg-info/
17
+ *.egg
18
+
19
+ # Testing & Coverage
20
+ .coverage
21
+ .coverage.*
22
+ htmlcov/
23
+ coverage.xml
24
+ .pytest_cache/
25
+
26
+ # ruff
27
+ .ruff_cache/
28
+
29
+ # Secrets
30
+ .env
31
+ .env.*
32
+ secrets/
jirapi-0.1.0/AGENTS.md ADDED
@@ -0,0 +1,149 @@
1
+ # AGENTS.md
2
+
3
+ This file provides guidance to AI coding agents when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ `jirapi` is a modern, type-safe Python client for the Jira Cloud REST API, built on [HTTPX](https://www.python-httpx.org/) for first-class sync and async support.
8
+
9
+ **Technology Stack:**
10
+ - Python 3.11+ with UV for dependency management
11
+ - [Taskfile](https://taskfile.dev/) (go-task) for task running (`Taskfile.yml`)
12
+ - Ruff for linting and formatting
13
+ - pytest for testing with pytest-cov for coverage
14
+ - HTTPX for HTTP transport (sync + async)
15
+ - Pydantic for data models and validation
16
+
17
+ ## Common Development Commands
18
+
19
+ ### Setup and Installation
20
+ ```bash
21
+ task setup # uv sync --all-groups
22
+ uv run python -c "import jirapi; print('OK')"
23
+ ```
24
+
25
+ ### Testing
26
+ ```bash
27
+ task test # uv run pytest tests/unit
28
+ task test:cov # uv run pytest --cov=jirapi tests/unit
29
+ uv run pytest tests/unit/test_specific.py # single file
30
+ task test:integration # requires live Jira API access
31
+ ```
32
+
33
+ ### Code Quality
34
+ ```bash
35
+ task format # uv run ruff format .
36
+ task lint # uv run ruff check .
37
+ task lint:fix # uv run ruff check . --fix
38
+ task check # lint + format check + tests
39
+ task lock:check # verify lockfile is up-to-date
40
+ ```
41
+
42
+ ### Code Generation
43
+ ```bash
44
+ task generate:models # generate Pydantic models from OpenAPI spec
45
+ task generate:resources # generate resource classes from OpenAPI spec
46
+ task generate # run all generators (models + resources)
47
+ ```
48
+
49
+ ### Building
50
+ ```bash
51
+ task build # uv build
52
+ ```
53
+
54
+ ## Architecture and Code Organization
55
+
56
+ ```
57
+ jirapi/ # Python package (the library)
58
+ ├── __init__.py # Public API exports
59
+ ├── client.py # Jira (sync + async)
60
+ ├── models/ # Pydantic request/response models
61
+ ├── exceptions.py # Custom exception hierarchy
62
+ └── py.typed # PEP 561 marker
63
+
64
+ scripts/ # Code generation scripts
65
+ ├── generate_models.py # Pydantic model generator (OpenAPI → models/)
66
+ └── generate_resources.py # Resource class generator (OpenAPI → resources/)
67
+
68
+ tests/ # Test suites
69
+ ├── unit/ # Unit tests (pytest default)
70
+ │ └── conftest.py # Shared fixtures
71
+ └── integration/ # Integration tests (live API)
72
+
73
+ docs/ # Documentation
74
+ ```
75
+
76
+ ## Code Style and Standards
77
+
78
+ ### Python Style
79
+
80
+ **Imports:**
81
+ - Use absolute imports over relative imports
82
+ - Order imports alphabetically (isort via ruff)
83
+
84
+ **Type Hints:**
85
+ - Use type hints for all function parameters and returns
86
+ - Prefer built-in generics (`list[str]`, `dict[str, int]`) over `typing` equivalents
87
+ - Use union syntax (`str | None`) instead of `Optional[str]`
88
+ - Do not import deprecated typing names (`Dict`, `List`, `Set`, `Tuple`, `Optional`)
89
+
90
+ **Naming Conventions:**
91
+ - snake_case for functions and variables
92
+ - PascalCase for classes
93
+ - UPPER_CASE for constants
94
+ - Maximum line length: 100 characters
95
+
96
+ **Docstrings:**
97
+ - Use Google-style docstrings (configured in ruff)
98
+ - Document all public APIs
99
+ - Focus on why, not what
100
+ - Every module must have a module-level docstring
101
+
102
+ **Other Rules:**
103
+ - `__init__.py` files must define `__all__` to declare the public API
104
+ - Always specify exception types — never use bare `except:` or `except Exception:` without good reason
105
+ - Prefer `async def` for all I/O-bound operations
106
+ - Constants over magic numbers
107
+ - Single responsibility per function
108
+
109
+ ### Testing Requirements
110
+
111
+ - Write tests before fixing bugs
112
+ - Test edge cases and error scenarios
113
+ - Use pytest for all testing
114
+ - Use proper mocking with pytest-mock and respx (for HTTPX)
115
+ - Use fixtures for test setup
116
+ - Mark integration tests with `@pytest.mark.integration`
117
+ - **MUST run `task format && task lint` before completion**
118
+
119
+ ### Security
120
+
121
+ - Never commit credentials or sensitive information
122
+ - Never hardcode API tokens — accept them as parameters
123
+ - Sanitize all user inputs
124
+
125
+ ### Version Control
126
+
127
+ - Feature branches: `feature/<description>`
128
+ - Bugfix branches: `fix/<description>`
129
+ - Small, focused commits with clear messages
130
+ - Follow semantic versioning (MAJOR.MINOR.PATCH)
131
+ - **MUST run `task format && task lint` before considering work complete**
132
+
133
+ ### Changelog
134
+
135
+ - **MUST update `CHANGELOG.md`** when making user-facing changes
136
+ - Add a new version section (e.g. `## [0.2.0] - YYYY-MM-DD`) or append to the latest unreleased section at the top
137
+ - Use the appropriate subsection: `Added`, `Changed`, `Fixed`, `Removed`
138
+ - Follow [Keep a Changelog](https://keepachangelog.com/) format
139
+ - Do not modify entries for already-released versions
140
+
141
+ ### Development Workflow
142
+
143
+ 1. Create feature branch
144
+ 2. Make changes following coding standards
145
+ 3. Run quality checks: `task format && task lint`
146
+ 4. Run tests: `task test:cov`
147
+ 5. Verify lockfile: `task lock:check`
148
+ 6. Update `CHANGELOG.md`
149
+ 7. Submit PR using the PR template