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.
- jirapi-0.1.0/.claude/settings.json +46 -0
- jirapi-0.1.0/.github/FUNDING.yml +1 -0
- jirapi-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +75 -0
- jirapi-0.1.0/.github/pull_request_template.md +24 -0
- jirapi-0.1.0/.github/workflows/ci.yml +128 -0
- jirapi-0.1.0/.github/workflows/claude-code.yml +54 -0
- jirapi-0.1.0/.github/workflows/claude-issue-code.yml +83 -0
- jirapi-0.1.0/.github/workflows/claude-issue-triage.yml +53 -0
- jirapi-0.1.0/.github/workflows/claude-pull_request-code_review.yml +37 -0
- jirapi-0.1.0/.gitignore +32 -0
- jirapi-0.1.0/AGENTS.md +149 -0
- jirapi-0.1.0/CHANGELOG.md +36 -0
- jirapi-0.1.0/LICENSE +21 -0
- jirapi-0.1.0/PKG-INFO +240 -0
- jirapi-0.1.0/README.md +212 -0
- jirapi-0.1.0/Taskfile.yml +94 -0
- jirapi-0.1.0/docs/.gitkeep +0 -0
- jirapi-0.1.0/docs/jira-cloud-api-openapi.json +1 -0
- jirapi-0.1.0/jirapi/__init__.py +32 -0
- jirapi-0.1.0/jirapi/_base_client.py +188 -0
- jirapi-0.1.0/jirapi/_resource.py +34 -0
- jirapi-0.1.0/jirapi/_types.py +17 -0
- jirapi-0.1.0/jirapi/client.py +1425 -0
- jirapi-0.1.0/jirapi/exceptions.py +109 -0
- jirapi-0.1.0/jirapi/models/__init__.py +20935 -0
- jirapi-0.1.0/jirapi/pagination.py +259 -0
- jirapi-0.1.0/jirapi/py.typed +0 -0
- jirapi-0.1.0/jirapi/resources/__init__.py +351 -0
- jirapi-0.1.0/jirapi/resources/announcement_banner.py +42 -0
- jirapi-0.1.0/jirapi/resources/app_data_policies.py +36 -0
- jirapi-0.1.0/jirapi/resources/app_migration.py +79 -0
- jirapi-0.1.0/jirapi/resources/app_properties.py +112 -0
- jirapi-0.1.0/jirapi/resources/application_roles.py +34 -0
- jirapi-0.1.0/jirapi/resources/audit_records.py +46 -0
- jirapi-0.1.0/jirapi/resources/avatars.py +139 -0
- jirapi-0.1.0/jirapi/resources/classification_levels.py +32 -0
- jirapi-0.1.0/jirapi/resources/dashboards.py +412 -0
- jirapi-0.1.0/jirapi/resources/dynamic_modules.py +58 -0
- jirapi-0.1.0/jirapi/resources/field_schemes.py +328 -0
- jirapi-0.1.0/jirapi/resources/filter_sharing.py +96 -0
- jirapi-0.1.0/jirapi/resources/filters.py +320 -0
- jirapi-0.1.0/jirapi/resources/group_and_user_picker.py +74 -0
- jirapi-0.1.0/jirapi/resources/groups.py +293 -0
- jirapi-0.1.0/jirapi/resources/issue_attachments.py +136 -0
- jirapi-0.1.0/jirapi/resources/issue_bulk_operations.py +226 -0
- jirapi-0.1.0/jirapi/resources/issue_comment_properties.py +64 -0
- jirapi-0.1.0/jirapi/resources/issue_comments.py +192 -0
- jirapi-0.1.0/jirapi/resources/issue_custom_field_associations.py +50 -0
- jirapi-0.1.0/jirapi/resources/issue_custom_field_configuration_apps.py +163 -0
- jirapi-0.1.0/jirapi/resources/issue_custom_field_contexts.py +374 -0
- jirapi-0.1.0/jirapi/resources/issue_custom_field_options.py +198 -0
- jirapi-0.1.0/jirapi/resources/issue_custom_field_options_apps.py +214 -0
- jirapi-0.1.0/jirapi/resources/issue_custom_field_values_apps.py +80 -0
- jirapi-0.1.0/jirapi/resources/issue_fields.py +240 -0
- jirapi-0.1.0/jirapi/resources/issue_link_types.py +83 -0
- jirapi-0.1.0/jirapi/resources/issue_links.py +48 -0
- jirapi-0.1.0/jirapi/resources/issue_navigator_settings.py +34 -0
- jirapi-0.1.0/jirapi/resources/issue_notification_schemes.py +220 -0
- jirapi-0.1.0/jirapi/resources/issue_priorities.py +70 -0
- jirapi-0.1.0/jirapi/resources/issue_properties.py +153 -0
- jirapi-0.1.0/jirapi/resources/issue_redaction.py +38 -0
- jirapi-0.1.0/jirapi/resources/issue_remote_links.py +126 -0
- jirapi-0.1.0/jirapi/resources/issue_resolutions.py +152 -0
- jirapi-0.1.0/jirapi/resources/issue_search.py +180 -0
- jirapi-0.1.0/jirapi/resources/issue_security_level.py +74 -0
- jirapi-0.1.0/jirapi/resources/issue_security_schemes.py +427 -0
- jirapi-0.1.0/jirapi/resources/issue_type_properties.py +70 -0
- jirapi-0.1.0/jirapi/resources/issue_type_schemes.py +266 -0
- jirapi-0.1.0/jirapi/resources/issue_type_screen_schemes.py +324 -0
- jirapi-0.1.0/jirapi/resources/issue_types.py +124 -0
- jirapi-0.1.0/jirapi/resources/issue_votes.py +44 -0
- jirapi-0.1.0/jirapi/resources/issue_watchers.py +72 -0
- jirapi-0.1.0/jirapi/resources/issue_worklog_properties.py +90 -0
- jirapi-0.1.0/jirapi/resources/issue_worklogs.py +398 -0
- jirapi-0.1.0/jirapi/resources/issues.py +582 -0
- jirapi-0.1.0/jirapi/resources/jira_expressions.py +71 -0
- jirapi-0.1.0/jirapi/resources/jira_settings.py +88 -0
- jirapi-0.1.0/jirapi/resources/jql.py +156 -0
- jirapi-0.1.0/jirapi/resources/jql_functions_apps.py +124 -0
- jirapi-0.1.0/jirapi/resources/labels.py +30 -0
- jirapi-0.1.0/jirapi/resources/license_metrics.py +50 -0
- jirapi-0.1.0/jirapi/resources/migration_of_connect_modules_to_forge.py +32 -0
- jirapi-0.1.0/jirapi/resources/myself.py +72 -0
- jirapi-0.1.0/jirapi/resources/permission_schemes.py +195 -0
- jirapi-0.1.0/jirapi/resources/permissions.py +122 -0
- jirapi-0.1.0/jirapi/resources/plans.py +147 -0
- jirapi-0.1.0/jirapi/resources/priority_schemes.py +265 -0
- jirapi-0.1.0/jirapi/resources/project_avatars.py +87 -0
- jirapi-0.1.0/jirapi/resources/project_categories.py +82 -0
- jirapi-0.1.0/jirapi/resources/project_classification_levels.py +64 -0
- jirapi-0.1.0/jirapi/resources/project_components.py +197 -0
- jirapi-0.1.0/jirapi/resources/project_email.py +42 -0
- jirapi-0.1.0/jirapi/resources/project_features.py +48 -0
- jirapi-0.1.0/jirapi/resources/project_key_and_name_validation.py +58 -0
- jirapi-0.1.0/jirapi/resources/project_permission_schemes.py +90 -0
- jirapi-0.1.0/jirapi/resources/project_properties.py +70 -0
- jirapi-0.1.0/jirapi/resources/project_role_actors.py +144 -0
- jirapi-0.1.0/jirapi/resources/project_roles.py +172 -0
- jirapi-0.1.0/jirapi/resources/project_templates.py +118 -0
- jirapi-0.1.0/jirapi/resources/project_types.py +58 -0
- jirapi-0.1.0/jirapi/resources/project_versions.py +264 -0
- jirapi-0.1.0/jirapi/resources/projects.py +273 -0
- jirapi-0.1.0/jirapi/resources/screen_schemes.py +115 -0
- jirapi-0.1.0/jirapi/resources/screen_tab_fields.py +92 -0
- jirapi-0.1.0/jirapi/resources/screen_tabs.py +122 -0
- jirapi-0.1.0/jirapi/resources/screens.py +165 -0
- jirapi-0.1.0/jirapi/resources/server_info.py +24 -0
- jirapi-0.1.0/jirapi/resources/service_registry.py +30 -0
- jirapi-0.1.0/jirapi/resources/status.py +218 -0
- jirapi-0.1.0/jirapi/resources/tasks.py +34 -0
- jirapi-0.1.0/jirapi/resources/teams_in_plan.py +162 -0
- jirapi-0.1.0/jirapi/resources/time_tracking.py +84 -0
- jirapi-0.1.0/jirapi/resources/ui_modifications_apps.py +101 -0
- jirapi-0.1.0/jirapi/resources/untagged.py +36 -0
- jirapi-0.1.0/jirapi/resources/user_properties.py +142 -0
- jirapi-0.1.0/jirapi/resources/user_search.py +398 -0
- jirapi-0.1.0/jirapi/resources/users.py +278 -0
- jirapi-0.1.0/jirapi/resources/webhooks.py +103 -0
- jirapi-0.1.0/jirapi/resources/workflow_scheme_drafts.py +254 -0
- jirapi-0.1.0/jirapi/resources/workflow_scheme_project_associations.py +50 -0
- jirapi-0.1.0/jirapi/resources/workflow_schemes.py +419 -0
- jirapi-0.1.0/jirapi/resources/workflow_status_categories.py +34 -0
- jirapi-0.1.0/jirapi/resources/workflow_statuses.py +34 -0
- jirapi-0.1.0/jirapi/resources/workflow_transition_rules.py +119 -0
- jirapi-0.1.0/jirapi/resources/workflows.py +400 -0
- jirapi-0.1.0/pyproject.toml +130 -0
- jirapi-0.1.0/renovate.json +46 -0
- jirapi-0.1.0/scripts/generate_models.py +184 -0
- jirapi-0.1.0/scripts/generate_resources.py +616 -0
- jirapi-0.1.0/tests/__init__.py +1 -0
- jirapi-0.1.0/tests/unit/__init__.py +1 -0
- jirapi-0.1.0/tests/unit/conftest.py +32 -0
- jirapi-0.1.0/tests/unit/test_base_client.py +174 -0
- jirapi-0.1.0/tests/unit/test_exceptions.py +99 -0
- jirapi-0.1.0/tests/unit/test_pagination.py +251 -0
- jirapi-0.1.0/tests/unit/test_resources/__init__.py +1 -0
- jirapi-0.1.0/tests/unit/test_resources/test_issues.py +85 -0
- jirapi-0.1.0/tests/unit/test_resources/test_primitive_returns.py +102 -0
- jirapi-0.1.0/tests/unit/test_resources/test_projects.py +83 -0
- 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"
|
jirapi-0.1.0/.gitignore
ADDED
|
@@ -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
|