jiramaxx 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.
@@ -0,0 +1,335 @@
1
+ Metadata-Version: 2.4
2
+ Name: jiramaxx
3
+ Version: 0.1.0
4
+ Summary: A lightweight console GUI for creating and managing Jira tickets without leaving your keyboard
5
+ License: MIT
6
+ Keywords: jira,gui,productivity,tickets
7
+ Requires-Python: >=3.10
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: Microsoft :: Windows
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Software Development :: Bug Tracking
20
+ Requires-Dist: PySimpleGUI (==4.60.5.1)
21
+ Requires-Dist: keyboard (>=0.13.5)
22
+ Requires-Dist: pyyaml (>=6.0)
23
+ Requires-Dist: requests (>=2.28.0)
24
+ Project-URL: Homepage, https://github.com/doctoptogonopus/jiramaxx
25
+ Project-URL: Repository, https://github.com/doctoptogonopus/jiramaxx
26
+ Description-Content-Type: text/markdown
27
+
28
+ # Jiramaxx
29
+
30
+ A lightweight desktop GUI for creating and managing Jira tickets without leaving your keyboard. Runs as a background daemon and pops up on a global hotkey.
31
+
32
+ ---
33
+
34
+ ## Requirements
35
+
36
+ - Python 3.10+
37
+ - A Jira Cloud account with an API token
38
+
39
+ ```
40
+ pip install -r requirements.txt
41
+ ```
42
+
43
+ ---
44
+
45
+ ## Setup
46
+
47
+ ### 1. First run
48
+
49
+ ```
50
+ python main.py --gui
51
+ ```
52
+
53
+ On first run with no `config.yaml`, a default one is created and the app exits. Fill in your credentials (see below) and run again, or use the in-app Config screen.
54
+
55
+ ### 2. Configure credentials
56
+
57
+ Open the Config screen (press **C** on the main window or run `python main.py --gui` and press C), go to the **Jira** tab.
58
+
59
+ | Field | What to enter |
60
+ |---|---|
61
+ | **Base URL** | Your Atlassian domain, e.g. `https://yourcompany.atlassian.net` |
62
+ | **API Token** | Generated at [id.atlassian.com/manage-profile/security/api-tokens](https://id.atlassian.com/manage-profile/security/api-tokens) |
63
+ | **User Email** | The email address on your Atlassian account |
64
+ | **Project Key** | The short key for your project (e.g. `ENG`, `JCSD`). Use the **Browse** button to find it. |
65
+ | **Board ID** | The numeric ID of your Scrum/Kanban board. Found in the URL when viewing your board: `.../jira/software/projects/XXX/boards/2` — the trailing number is the board ID. |
66
+ | **My Account ID** | Your Atlassian account ID. Found at: Jira → Profile → the ID in the URL, or via `GET /rest/api/3/myself`. Used when assigning tickets to yourself. |
67
+
68
+ #### Finding your Project Key
69
+
70
+ Click **Browse** next to the Project Key field. The tool will connect to Jira using the credentials currently typed in the form and display all accessible projects. Click one and press **Select** (or double-click) to fill the field automatically.
71
+
72
+ #### API Token — important notes
73
+
74
+ Use the **"Create API token"** button (not "Create API token with scopes"). Atlassian's scoped tokens are designed for OAuth 2.0 app integrations and cannot be used with direct HTTP Basic authentication.
75
+
76
+ Classic tokens already inherit exactly your Jira account's permission level. For least-privileged access, restrict your account's role on the project in **Jira → Project Settings → Permissions** rather than restricting the token itself.
77
+
78
+ ---
79
+
80
+ ### 3. Custom Field IDs
81
+
82
+ Jira stores certain fields under instance-specific IDs (e.g. `customfield_10016`). These vary per Jira instance. Find them in **Project Settings → Fields** or ask your Jira admin.
83
+
84
+ | Setting | What it controls | Common value |
85
+ |---|---|---|
86
+ | **Story Points field** | The custom field used to store story point estimates | `customfield_10016` |
87
+ | **Epic Link field** | The custom field that links a Story/Task to an Epic | `customfield_10014` |
88
+ | **Epic Name field** | The custom field for an Epic's short name label | `customfield_10011` |
89
+
90
+ Leave these blank to use the defaults above. If story points are not saving, this is the first thing to check.
91
+
92
+ ---
93
+
94
+ ## Running
95
+
96
+ ### GUI mode (direct)
97
+
98
+ ```
99
+ python main.py --gui
100
+ ```
101
+
102
+ Opens the main window immediately. Use this for day-to-day ticket creation.
103
+
104
+ ### Daemon mode (background hotkey listener)
105
+
106
+ ```
107
+ python main.py
108
+ ```
109
+
110
+ Runs silently in the background. Press the configured hotkeys anywhere on your system to open the GUI. Press **Ctrl-C** in the terminal to quit.
111
+
112
+ ---
113
+
114
+ ## Main Window
115
+
116
+ ```
117
+ ┌─────────────────────────────────────┐
118
+ │ Jiramaxx │
119
+ │ 2 incomplete draft(s) — press D… │
120
+ │ ───────────────────────────────── │
121
+ │ [ (N) New Ticket ] [ (D) Drafts ] │
122
+ │ [ (M) Manage ] [ (C) Config ] │
123
+ │ [ (Q) Quit ] │
124
+ └─────────────────────────────────────┘
125
+ ```
126
+
127
+ | Button / Key | Action |
128
+ |---|---|
129
+ | **N** | Open the ticket type selector, then the ticket form |
130
+ | **D** | Open the draft list (disabled when no drafts exist) |
131
+ | **M** | Open the sprint ticket manager (Add Comment / Change Status) |
132
+ | **C** | Open the configuration editor |
133
+ | **Q** / Escape | Quit |
134
+
135
+ The draft counter updates automatically after every action.
136
+
137
+ ---
138
+
139
+ ## Creating a Ticket
140
+
141
+ 1. Press **N** (or click New Ticket).
142
+ 2. Select a ticket type — keyboard shortcuts **1–5** or the **first letter** of the type name (S, B, T, E, I) also work.
143
+ 3. Fill in the form. Required fields are marked with `*`. Use **Tab / Shift+Tab** to move between fields (Tab does not insert whitespace in multiline fields).
144
+ 4. Choose an action:
145
+
146
+ | Button / Shortcut | Action |
147
+ |---|---|
148
+ | **Submit to Jira** / Ctrl+Enter | Validates required fields, sends to Jira API, marks draft as submitted and keeps a local copy. |
149
+ | **Save Draft** / Ctrl+S | Saves locally without submitting. You can return to it later via Drafts. |
150
+ | **Cancel** / Escape | Closes without saving. |
151
+
152
+ ### Field reference
153
+
154
+ | Field | Type | Notes |
155
+ |---|---|---|
156
+ | **Summary** | Text | The ticket title. Required on all types. |
157
+ | **Description** | Multiline text | Free-form description. Required on all types. |
158
+ | **Story Points** | Spinner (0,1,2,3,5,8,13,21) | Fibonacci scale. Saved to the custom field configured in Config → Custom Field IDs. |
159
+ | **Assignee (account ID)** | Text | Must be an Atlassian **account ID**, not a display name or email. Type `me` to assign to yourself (uses **My Account ID** from Config). Leave blank to leave unassigned. |
160
+ | **Labels** | Text | Comma-separated list of labels, e.g. `backend, urgent`. |
161
+ | **Sprint** | Dropdown | Populated from the sprint cache. Use **Refresh Sprints** in Config → Jira to populate. Select `(Backlog)` to leave unassigned to a sprint. |
162
+ | **Epic Link** | Text | The Jira issue key of an existing Epic to link to, e.g. `JCSD-12`. Full browse URLs are also accepted and stripped down to the key automatically. Sent as the Epic Link custom field. |
163
+ | **Epic Name** | Text | Short label for the Epic itself. Only meaningful on Epic tickets. |
164
+ | **Severity** | Dropdown | Critical / High / Medium / Low. Bug tickets only. |
165
+ | **Steps to Reproduce** | Multiline text | Bug tickets only. |
166
+ | **Priority** | Dropdown | Highest / High / Medium / Low / Lowest. |
167
+
168
+ ### Ticket types and their default fields
169
+
170
+ | Type | Default Required | Default Optional |
171
+ |---|---|---|
172
+ | **Story** | Summary, Story Points, Description | Assignee, Labels, Sprint, Epic Link, Priority |
173
+ | **Bug** | Summary, Description, Severity, Steps to Reproduce | Assignee, Labels, Priority |
174
+ | **Task** | Summary, Description | Assignee, Story Points, Labels, Priority |
175
+ | **Epic** | Summary, Description, Epic Name | Labels, Priority |
176
+ | **Initiative** | Summary, Description | Labels, Priority |
177
+
178
+ Which fields are required vs. optional is fully configurable per ticket type in **Config → Ticket Types**.
179
+
180
+ ---
181
+
182
+ ## Drafts
183
+
184
+ Drafts are stored as YAML files in `~/.jiramaxx/cache/` (configurable). A draft is created any time you click **Save Draft**. After a successful Jira submission the ticket is also retained locally (marked submitted) so you have a local record.
185
+
186
+ ### Draft list actions
187
+
188
+ | Button | Action |
189
+ |---|---|
190
+ | **Open** / Enter / double-click | Re-open the ticket form to continue editing or submit |
191
+ | **Delete** | Permanently removes the local draft (prompts for confirmation) |
192
+ | **Cancel** / Escape | Returns to the main window |
193
+
194
+ ---
195
+
196
+ ## Managing Existing Tickets
197
+
198
+ Press **M** to open the sprint ticket manager. It loads all issues from the active sprint on your configured board.
199
+
200
+ The first ticket is selected automatically — use the **↑ / ↓ arrow keys** to navigate the list without clicking.
201
+
202
+ | Button / Key | Action |
203
+ |---|---|
204
+ | **C** | Add a comment to the selected ticket |
205
+ | **S** | Change the status of the selected ticket |
206
+ | **X** / Escape | Close the manager |
207
+
208
+ ### Add Comment
209
+
210
+ Select a ticket and press **C** (or click Add Comment). Type your comment in the popup and press Enter. The comment is posted to Jira immediately.
211
+
212
+ ### Change Status
213
+
214
+ Select a ticket and press **S** (or click Change Status). The tool fetches the available transitions for that issue (these depend on your Jira workflow) and shows them in a list. Select one and click **Apply** (or press Enter) to transition the issue.
215
+
216
+ ---
217
+
218
+ ## Configuration Editor
219
+
220
+ Press **C** on the main window to open the full config editor. Changes take effect in the running app immediately on Save — no restart needed.
221
+
222
+ ### Jira tab
223
+
224
+ Credentials and connection settings. See the Setup section above.
225
+
226
+ ### App Settings tab
227
+
228
+ | Setting | Notes |
229
+ |---|---|
230
+ | **Cache Directory** | Where local drafts are stored. Supports `~` expansion. Default: `~/.jiramaxx/cache` |
231
+ | **UI Theme** | Any valid PySimpleGUI theme name, e.g. `DarkBlue3`, `LightGrey1`, `Reddit`. |
232
+ | **Hotkey: Create** | Global hotkey to open the main window. Default: `ctrl+alt+j` |
233
+ | **Hotkey: Manage** | Global hotkey to open the sprint manager directly. Default: `ctrl+alt+m` |
234
+
235
+ Theme changes take effect the next time you open a window.
236
+
237
+ ### Ticket Types tab
238
+
239
+ Controls which fields appear in the form for each ticket type, and whether they are required or optional.
240
+
241
+ - **Required** — field appears in the form and must be filled before submitting
242
+ - **Optional** — field appears in the form but can be left blank
243
+ - **Not in Form** — field is hidden entirely for this ticket type
244
+
245
+ #### Reordering fields
246
+
247
+ Fields appear in the form in the order listed here. Use the **↑** and **↓** buttons to change the order within Required or Optional.
248
+
249
+ #### Moving fields between lists
250
+
251
+ - Select a field in **Not in Form** and click **→ Req** or **→ Opt** to add it to the form
252
+ - Select a field in **Required** or **Optional** and click **✕** to move it back to Not in Form
253
+
254
+ Changes apply to all new tickets. Open drafts retain the field layout they were created with.
255
+
256
+ ---
257
+
258
+ ## Hotkeys (daemon mode)
259
+
260
+ | Hotkey | Action |
261
+ |---|---|
262
+ | `ctrl+alt+j` | Open main window (new ticket / drafts) |
263
+ | `ctrl+alt+m` | Open sprint ticket manager |
264
+
265
+ Both hotkeys are configurable in Config → App Settings. Changes require a daemon restart to take effect (the GUI mode picks up hotkey changes immediately on next launch).
266
+
267
+ ---
268
+
269
+ ## config.yaml reference
270
+
271
+ ```yaml
272
+ jira:
273
+ base_url: https://yourcompany.atlassian.net
274
+ api_token: YOUR_API_TOKEN
275
+ user_email: you@example.com
276
+ project_key: ENG
277
+ board_id: '2'
278
+ my_account_id: 61c8a3b2f1e4d500685e1234
279
+ custom_fields:
280
+ story_points: customfield_10016
281
+ epic_link: customfield_10014
282
+ epic_name: customfield_10011
283
+
284
+ cache:
285
+ directory: ~/.jiramaxx/cache
286
+
287
+ ui:
288
+ theme: DarkBlue3
289
+
290
+ hotkeys:
291
+ create_ticket: ctrl+alt+j
292
+ manage_tickets: ctrl+alt+m
293
+
294
+ ticket_types:
295
+ Story:
296
+ required: [summary, story_points, description]
297
+ optional: [assignee, labels, sprint, epic_link, priority]
298
+ Bug:
299
+ required: [summary, description, severity, steps_to_reproduce]
300
+ optional: [assignee, labels, priority]
301
+ Task:
302
+ required: [summary, description]
303
+ optional: [assignee, story_points, labels, priority]
304
+ Epic:
305
+ required: [summary, description, epic_name]
306
+ optional: [labels, priority]
307
+ Initiative:
308
+ required: [summary, description]
309
+ optional: [labels, priority]
310
+ ```
311
+
312
+ The `ticket_types` section is managed by the Config GUI. Hand-editing it is safe as long as field names match those in the Field reference table above.
313
+
314
+ ---
315
+
316
+ ## Troubleshooting
317
+
318
+ **400 Bad Request when submitting**
319
+ - Click **Show Stack Trace** on the error dialog to see the full Jira response and the exact payload sent.
320
+ - Most common causes: wrong project key (use Browse to verify), incorrect custom field IDs (check Project Settings → Fields in Jira), `epic_name` included on a non-Epic ticket type.
321
+
322
+ **Story points not saving to Jira**
323
+ - Check the Story Points custom field ID in Config → Jira. The default (`customfield_10016`) is not universal.
324
+
325
+ **Assignee field not working**
326
+ - The Assignee field requires the user's **Atlassian account ID** (a 24-character hex string), not their name or email. Jira Cloud's v3 API does not accept `name`-based assignees.
327
+
328
+ **Hotkeys not triggering**
329
+ - On Windows, the `keyboard` library may require running the terminal as Administrator.
330
+ - Confirm the hotkey string format: modifiers and keys are separated by `+`, e.g. `ctrl+alt+j`.
331
+
332
+ **"No active sprint tickets found"**
333
+ - Verify your Board ID is correct. It appears in the Jira board URL: `.../boards/2` → `2`.
334
+ - Confirm the board has an active sprint (not just future sprints).
335
+
@@ -0,0 +1,307 @@
1
+ # Jiramaxx
2
+
3
+ A lightweight desktop GUI for creating and managing Jira tickets without leaving your keyboard. Runs as a background daemon and pops up on a global hotkey.
4
+
5
+ ---
6
+
7
+ ## Requirements
8
+
9
+ - Python 3.10+
10
+ - A Jira Cloud account with an API token
11
+
12
+ ```
13
+ pip install -r requirements.txt
14
+ ```
15
+
16
+ ---
17
+
18
+ ## Setup
19
+
20
+ ### 1. First run
21
+
22
+ ```
23
+ python main.py --gui
24
+ ```
25
+
26
+ On first run with no `config.yaml`, a default one is created and the app exits. Fill in your credentials (see below) and run again, or use the in-app Config screen.
27
+
28
+ ### 2. Configure credentials
29
+
30
+ Open the Config screen (press **C** on the main window or run `python main.py --gui` and press C), go to the **Jira** tab.
31
+
32
+ | Field | What to enter |
33
+ |---|---|
34
+ | **Base URL** | Your Atlassian domain, e.g. `https://yourcompany.atlassian.net` |
35
+ | **API Token** | Generated at [id.atlassian.com/manage-profile/security/api-tokens](https://id.atlassian.com/manage-profile/security/api-tokens) |
36
+ | **User Email** | The email address on your Atlassian account |
37
+ | **Project Key** | The short key for your project (e.g. `ENG`, `JCSD`). Use the **Browse** button to find it. |
38
+ | **Board ID** | The numeric ID of your Scrum/Kanban board. Found in the URL when viewing your board: `.../jira/software/projects/XXX/boards/2` — the trailing number is the board ID. |
39
+ | **My Account ID** | Your Atlassian account ID. Found at: Jira → Profile → the ID in the URL, or via `GET /rest/api/3/myself`. Used when assigning tickets to yourself. |
40
+
41
+ #### Finding your Project Key
42
+
43
+ Click **Browse** next to the Project Key field. The tool will connect to Jira using the credentials currently typed in the form and display all accessible projects. Click one and press **Select** (or double-click) to fill the field automatically.
44
+
45
+ #### API Token — important notes
46
+
47
+ Use the **"Create API token"** button (not "Create API token with scopes"). Atlassian's scoped tokens are designed for OAuth 2.0 app integrations and cannot be used with direct HTTP Basic authentication.
48
+
49
+ Classic tokens already inherit exactly your Jira account's permission level. For least-privileged access, restrict your account's role on the project in **Jira → Project Settings → Permissions** rather than restricting the token itself.
50
+
51
+ ---
52
+
53
+ ### 3. Custom Field IDs
54
+
55
+ Jira stores certain fields under instance-specific IDs (e.g. `customfield_10016`). These vary per Jira instance. Find them in **Project Settings → Fields** or ask your Jira admin.
56
+
57
+ | Setting | What it controls | Common value |
58
+ |---|---|---|
59
+ | **Story Points field** | The custom field used to store story point estimates | `customfield_10016` |
60
+ | **Epic Link field** | The custom field that links a Story/Task to an Epic | `customfield_10014` |
61
+ | **Epic Name field** | The custom field for an Epic's short name label | `customfield_10011` |
62
+
63
+ Leave these blank to use the defaults above. If story points are not saving, this is the first thing to check.
64
+
65
+ ---
66
+
67
+ ## Running
68
+
69
+ ### GUI mode (direct)
70
+
71
+ ```
72
+ python main.py --gui
73
+ ```
74
+
75
+ Opens the main window immediately. Use this for day-to-day ticket creation.
76
+
77
+ ### Daemon mode (background hotkey listener)
78
+
79
+ ```
80
+ python main.py
81
+ ```
82
+
83
+ Runs silently in the background. Press the configured hotkeys anywhere on your system to open the GUI. Press **Ctrl-C** in the terminal to quit.
84
+
85
+ ---
86
+
87
+ ## Main Window
88
+
89
+ ```
90
+ ┌─────────────────────────────────────┐
91
+ │ Jiramaxx │
92
+ │ 2 incomplete draft(s) — press D… │
93
+ │ ───────────────────────────────── │
94
+ │ [ (N) New Ticket ] [ (D) Drafts ] │
95
+ │ [ (M) Manage ] [ (C) Config ] │
96
+ │ [ (Q) Quit ] │
97
+ └─────────────────────────────────────┘
98
+ ```
99
+
100
+ | Button / Key | Action |
101
+ |---|---|
102
+ | **N** | Open the ticket type selector, then the ticket form |
103
+ | **D** | Open the draft list (disabled when no drafts exist) |
104
+ | **M** | Open the sprint ticket manager (Add Comment / Change Status) |
105
+ | **C** | Open the configuration editor |
106
+ | **Q** / Escape | Quit |
107
+
108
+ The draft counter updates automatically after every action.
109
+
110
+ ---
111
+
112
+ ## Creating a Ticket
113
+
114
+ 1. Press **N** (or click New Ticket).
115
+ 2. Select a ticket type — keyboard shortcuts **1–5** or the **first letter** of the type name (S, B, T, E, I) also work.
116
+ 3. Fill in the form. Required fields are marked with `*`. Use **Tab / Shift+Tab** to move between fields (Tab does not insert whitespace in multiline fields).
117
+ 4. Choose an action:
118
+
119
+ | Button / Shortcut | Action |
120
+ |---|---|
121
+ | **Submit to Jira** / Ctrl+Enter | Validates required fields, sends to Jira API, marks draft as submitted and keeps a local copy. |
122
+ | **Save Draft** / Ctrl+S | Saves locally without submitting. You can return to it later via Drafts. |
123
+ | **Cancel** / Escape | Closes without saving. |
124
+
125
+ ### Field reference
126
+
127
+ | Field | Type | Notes |
128
+ |---|---|---|
129
+ | **Summary** | Text | The ticket title. Required on all types. |
130
+ | **Description** | Multiline text | Free-form description. Required on all types. |
131
+ | **Story Points** | Spinner (0,1,2,3,5,8,13,21) | Fibonacci scale. Saved to the custom field configured in Config → Custom Field IDs. |
132
+ | **Assignee (account ID)** | Text | Must be an Atlassian **account ID**, not a display name or email. Type `me` to assign to yourself (uses **My Account ID** from Config). Leave blank to leave unassigned. |
133
+ | **Labels** | Text | Comma-separated list of labels, e.g. `backend, urgent`. |
134
+ | **Sprint** | Dropdown | Populated from the sprint cache. Use **Refresh Sprints** in Config → Jira to populate. Select `(Backlog)` to leave unassigned to a sprint. |
135
+ | **Epic Link** | Text | The Jira issue key of an existing Epic to link to, e.g. `JCSD-12`. Full browse URLs are also accepted and stripped down to the key automatically. Sent as the Epic Link custom field. |
136
+ | **Epic Name** | Text | Short label for the Epic itself. Only meaningful on Epic tickets. |
137
+ | **Severity** | Dropdown | Critical / High / Medium / Low. Bug tickets only. |
138
+ | **Steps to Reproduce** | Multiline text | Bug tickets only. |
139
+ | **Priority** | Dropdown | Highest / High / Medium / Low / Lowest. |
140
+
141
+ ### Ticket types and their default fields
142
+
143
+ | Type | Default Required | Default Optional |
144
+ |---|---|---|
145
+ | **Story** | Summary, Story Points, Description | Assignee, Labels, Sprint, Epic Link, Priority |
146
+ | **Bug** | Summary, Description, Severity, Steps to Reproduce | Assignee, Labels, Priority |
147
+ | **Task** | Summary, Description | Assignee, Story Points, Labels, Priority |
148
+ | **Epic** | Summary, Description, Epic Name | Labels, Priority |
149
+ | **Initiative** | Summary, Description | Labels, Priority |
150
+
151
+ Which fields are required vs. optional is fully configurable per ticket type in **Config → Ticket Types**.
152
+
153
+ ---
154
+
155
+ ## Drafts
156
+
157
+ Drafts are stored as YAML files in `~/.jiramaxx/cache/` (configurable). A draft is created any time you click **Save Draft**. After a successful Jira submission the ticket is also retained locally (marked submitted) so you have a local record.
158
+
159
+ ### Draft list actions
160
+
161
+ | Button | Action |
162
+ |---|---|
163
+ | **Open** / Enter / double-click | Re-open the ticket form to continue editing or submit |
164
+ | **Delete** | Permanently removes the local draft (prompts for confirmation) |
165
+ | **Cancel** / Escape | Returns to the main window |
166
+
167
+ ---
168
+
169
+ ## Managing Existing Tickets
170
+
171
+ Press **M** to open the sprint ticket manager. It loads all issues from the active sprint on your configured board.
172
+
173
+ The first ticket is selected automatically — use the **↑ / ↓ arrow keys** to navigate the list without clicking.
174
+
175
+ | Button / Key | Action |
176
+ |---|---|
177
+ | **C** | Add a comment to the selected ticket |
178
+ | **S** | Change the status of the selected ticket |
179
+ | **X** / Escape | Close the manager |
180
+
181
+ ### Add Comment
182
+
183
+ Select a ticket and press **C** (or click Add Comment). Type your comment in the popup and press Enter. The comment is posted to Jira immediately.
184
+
185
+ ### Change Status
186
+
187
+ Select a ticket and press **S** (or click Change Status). The tool fetches the available transitions for that issue (these depend on your Jira workflow) and shows them in a list. Select one and click **Apply** (or press Enter) to transition the issue.
188
+
189
+ ---
190
+
191
+ ## Configuration Editor
192
+
193
+ Press **C** on the main window to open the full config editor. Changes take effect in the running app immediately on Save — no restart needed.
194
+
195
+ ### Jira tab
196
+
197
+ Credentials and connection settings. See the Setup section above.
198
+
199
+ ### App Settings tab
200
+
201
+ | Setting | Notes |
202
+ |---|---|
203
+ | **Cache Directory** | Where local drafts are stored. Supports `~` expansion. Default: `~/.jiramaxx/cache` |
204
+ | **UI Theme** | Any valid PySimpleGUI theme name, e.g. `DarkBlue3`, `LightGrey1`, `Reddit`. |
205
+ | **Hotkey: Create** | Global hotkey to open the main window. Default: `ctrl+alt+j` |
206
+ | **Hotkey: Manage** | Global hotkey to open the sprint manager directly. Default: `ctrl+alt+m` |
207
+
208
+ Theme changes take effect the next time you open a window.
209
+
210
+ ### Ticket Types tab
211
+
212
+ Controls which fields appear in the form for each ticket type, and whether they are required or optional.
213
+
214
+ - **Required** — field appears in the form and must be filled before submitting
215
+ - **Optional** — field appears in the form but can be left blank
216
+ - **Not in Form** — field is hidden entirely for this ticket type
217
+
218
+ #### Reordering fields
219
+
220
+ Fields appear in the form in the order listed here. Use the **↑** and **↓** buttons to change the order within Required or Optional.
221
+
222
+ #### Moving fields between lists
223
+
224
+ - Select a field in **Not in Form** and click **→ Req** or **→ Opt** to add it to the form
225
+ - Select a field in **Required** or **Optional** and click **✕** to move it back to Not in Form
226
+
227
+ Changes apply to all new tickets. Open drafts retain the field layout they were created with.
228
+
229
+ ---
230
+
231
+ ## Hotkeys (daemon mode)
232
+
233
+ | Hotkey | Action |
234
+ |---|---|
235
+ | `ctrl+alt+j` | Open main window (new ticket / drafts) |
236
+ | `ctrl+alt+m` | Open sprint ticket manager |
237
+
238
+ Both hotkeys are configurable in Config → App Settings. Changes require a daemon restart to take effect (the GUI mode picks up hotkey changes immediately on next launch).
239
+
240
+ ---
241
+
242
+ ## config.yaml reference
243
+
244
+ ```yaml
245
+ jira:
246
+ base_url: https://yourcompany.atlassian.net
247
+ api_token: YOUR_API_TOKEN
248
+ user_email: you@example.com
249
+ project_key: ENG
250
+ board_id: '2'
251
+ my_account_id: 61c8a3b2f1e4d500685e1234
252
+ custom_fields:
253
+ story_points: customfield_10016
254
+ epic_link: customfield_10014
255
+ epic_name: customfield_10011
256
+
257
+ cache:
258
+ directory: ~/.jiramaxx/cache
259
+
260
+ ui:
261
+ theme: DarkBlue3
262
+
263
+ hotkeys:
264
+ create_ticket: ctrl+alt+j
265
+ manage_tickets: ctrl+alt+m
266
+
267
+ ticket_types:
268
+ Story:
269
+ required: [summary, story_points, description]
270
+ optional: [assignee, labels, sprint, epic_link, priority]
271
+ Bug:
272
+ required: [summary, description, severity, steps_to_reproduce]
273
+ optional: [assignee, labels, priority]
274
+ Task:
275
+ required: [summary, description]
276
+ optional: [assignee, story_points, labels, priority]
277
+ Epic:
278
+ required: [summary, description, epic_name]
279
+ optional: [labels, priority]
280
+ Initiative:
281
+ required: [summary, description]
282
+ optional: [labels, priority]
283
+ ```
284
+
285
+ The `ticket_types` section is managed by the Config GUI. Hand-editing it is safe as long as field names match those in the Field reference table above.
286
+
287
+ ---
288
+
289
+ ## Troubleshooting
290
+
291
+ **400 Bad Request when submitting**
292
+ - Click **Show Stack Trace** on the error dialog to see the full Jira response and the exact payload sent.
293
+ - Most common causes: wrong project key (use Browse to verify), incorrect custom field IDs (check Project Settings → Fields in Jira), `epic_name` included on a non-Epic ticket type.
294
+
295
+ **Story points not saving to Jira**
296
+ - Check the Story Points custom field ID in Config → Jira. The default (`customfield_10016`) is not universal.
297
+
298
+ **Assignee field not working**
299
+ - The Assignee field requires the user's **Atlassian account ID** (a 24-character hex string), not their name or email. Jira Cloud's v3 API does not accept `name`-based assignees.
300
+
301
+ **Hotkeys not triggering**
302
+ - On Windows, the `keyboard` library may require running the terminal as Administrator.
303
+ - Confirm the hotkey string format: modifiers and keys are separated by `+`, e.g. `ctrl+alt+j`.
304
+
305
+ **"No active sprint tickets found"**
306
+ - Verify your Board ID is correct. It appears in the Jira board URL: `.../boards/2` → `2`.
307
+ - Confirm the board has an active sprint (not just future sprints).
File without changes