jirasify 2.0.0__py3-none-any.whl

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,214 @@
1
+ Metadata-Version: 2.4
2
+ Name: jirasify
3
+ Version: 2.0.0
4
+ Summary: Terminal UI for Jira worklogs and status transitions
5
+ Author-email: Jakob Holst <code@jakobholst.dk>
6
+ License: MIT
7
+ Project-URL: Homepage, https://gitlab.com/jakobholst/jaho_local_bin
8
+ Project-URL: Repository, https://gitlab.com/jakobholst/jaho_local_bin
9
+ Keywords: jira,tui,worklog,textual,terminal
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Software Development
17
+ Classifier: Topic :: Utilities
18
+ Requires-Python: >=3.14
19
+ Description-Content-Type: text/markdown
20
+ Requires-Dist: requests>=2.28
21
+ Requires-Dist: textual>=0.50
22
+ Requires-Dist: pyyaml>=6.0
23
+
24
+ # jirasify
25
+
26
+ Terminal UI for logging work and moving Jira issues, built with [Textual](https://textual.textualize.io/).
27
+
28
+ The distribution name on PyPI is `jirasify`; the main CLI command is `jirasify-tui`; the importable Python module is `jiratui`.
29
+
30
+ ## Install
31
+
32
+ ```bash
33
+ pip install jirasify
34
+ ```
35
+
36
+ ## Configure
37
+
38
+ On first run, `jirasify-tui` writes a template config to `~/.local/etc/jiratui/config.yaml` and prints a usage page. Edit the file (or answer the interactive prompt to fill it) with your Jira URL, project key, and username.
39
+
40
+ Your Jira token is read from the environment variable named by `authentication.token_env` (default: `JIRATOKEN`):
41
+
42
+ ```bash
43
+ export JIRATOKEN=your_token
44
+ ```
45
+
46
+ - **Self-hosted Jira (Data Center / Server)**: use a **Personal Access Token**. It is sent as `Authorization: Bearer <token>`.
47
+ - **Atlassian Cloud** (URL contains `atlassian.net`): use an **API token** from your Atlassian account. It is combined with `assignee.username` (your account email) via HTTP Basic auth.
48
+
49
+ Verify connectivity before launching the TUI:
50
+
51
+ ```bash
52
+ jirasify-tui --test
53
+ ```
54
+
55
+ Prints the configured URL and token env var, then hits `/rest/api/2/myself`. Exits with a non-zero status on missing config, unset token, or auth failure.
56
+
57
+ ## Usage
58
+
59
+ ```bash
60
+ jirasify-tui
61
+ ```
62
+
63
+ | Key | Action |
64
+ | -------- | --------------------------------- |
65
+ | `l` | Log view |
66
+ | `o` | Overview |
67
+ | `r` | Monthly report |
68
+ | `t`/`w` | Today's / this week's report |
69
+ | `m` | This month's report |
70
+ | `s` | Change status of selected issue |
71
+ | `e` | Set estimate on selected issue |
72
+ | `h` | Help |
73
+ | `Ctrl+R` | Refresh |
74
+ | `q` | Quit |
75
+
76
+ Time input accepts `30m`, `1h`, `2h30m`, `1d` (a day = 8h).
77
+
78
+ ## `jirasify`
79
+
80
+ `pip install jirasify` also installs a `jirasify` command that turns a
81
+ structured Markdown file into Jira user stories using the same
82
+ `~/.local/etc/jiratui/config.yaml` and `JIRATOKEN` env var as `jirasify-tui`.
83
+
84
+ Expected Markdown layout:
85
+
86
+ ```markdown
87
+ # My Epic Name - User Stories
88
+
89
+ ## 1. Project Overview
90
+
91
+ Free text.
92
+
93
+ ---
94
+
95
+ # Phase 1 - Foundations
96
+
97
+ ## User Story 001 - Inventory Environment
98
+
99
+ **Estimate:** 15 h
100
+
101
+ > As a developer, I will document ... so that ...
102
+
103
+ ### Scope
104
+ - Item A
105
+ - Item B
106
+
107
+ ### Acceptance Criteria
108
+ - Criterion 1
109
+ - Criterion 2
110
+ ```
111
+
112
+ - The top-level `# ...` heading (any H1 that is not a `# Phase ...`) is used
113
+ as the Epic name. A trailing ` - User Stories` suffix is stripped.
114
+ - Stories are only picked up under a `## User Story ...` heading inside a
115
+ `# Phase ...` section.
116
+ - Recognised subsections: `Scope`, `Validate`, `Include`, `Examples`,
117
+ `Acceptance Criteria`.
118
+
119
+ ### Commands
120
+
121
+ ```bash
122
+ jirasify --example # write ./example.md (plain markdown starter)
123
+ jirasify --template --file stories.md.j2 # write an Ansible/Jinja2 template
124
+
125
+ jirasify --file stories.md # parse + write .jirastories.state.json
126
+ jirasify --file stories.md --create # ensure Epic exists, create missing stories linked to it (idempotent)
127
+ jirasify --file stories.md --status # key/status/assignee/epic/estimate/used per story, grouped by phase with totals
128
+ jirasify --file stories.md --epic VOS-100 # relink stories to a specific epic
129
+ jirasify --file stories.md --epic VOS-100 --story VOS-142 # relink a single story
130
+
131
+ jirasify --reverse VOS-1234 # print a markdown reconstruction of an Epic and its stories
132
+ jirasify --reverse VOS-1234 --save # write it to <Epic_Name>.md (spaces -> _)
133
+ ```
134
+
135
+ `--create` skips stories that already have an `issue_key` recorded in
136
+ `.jirastories.state.json`, and also skips summaries that already exist in the
137
+ target project, so re-runs won't duplicate issues. If no Epic with the H1's
138
+ name exists, one is created before the stories.
139
+
140
+ ### Ansible / Jinja2 template
141
+
142
+ `--template` emits a `.j2` scaffold expecting these variables:
143
+
144
+ - `epic_name` (string)
145
+ - `project_overview` (string, optional)
146
+ - `phases`: list of `{ name, stories: [ { id, summary, estimate, description, scope?, acceptance_criteria? } ] }`
147
+
148
+ Render it with `ansible.builtin.template` (or `jinja2.Template`) to produce
149
+ a `stories.md`, then run `jirasify --file stories.md --create`.
150
+
151
+ ## `jirasify-list`
152
+
153
+ `pip install jirasify` also installs a `jirasify-list` command for read-only
154
+ listing of Jira objects, using the same config as `jirasify-tui`.
155
+
156
+ ```bash
157
+ jirasify-list --epics # Epics in jira.project (config), excluding Cancelled and Done
158
+ jirasify-list --epics --key VOS # override the project key
159
+ ```
160
+
161
+ ### Status filters (mutually exclusive)
162
+
163
+ ```bash
164
+ jirasify-list --epics --active # status = Implementing
165
+ jirasify-list --epics --planning # status = Planning
166
+ jirasify-list --epics --done # status = Done
167
+ jirasify-list --epics --cancelled # status = Cancelled
168
+ ```
169
+
170
+ Without any of these flags, Cancelled and Done epics are hidden by default.
171
+
172
+ ### Parent Link filter
173
+
174
+ ```bash
175
+ jirasify-list --epics --parent VOS-100 # exact parent (JQL: "Parent Link" = VOS-100)
176
+ jirasify-list --epics --parent VOS # any parent whose key starts with VOS-
177
+ ```
178
+
179
+ ### Full hierarchy
180
+
181
+ ```bash
182
+ jirasify-list --epics --full # also show stories under each epic and subtasks under each story
183
+ ```
184
+
185
+ `--full` issues one extra batched JQL for all epic children (`"Epic Link" in (…)`)
186
+ and one for all subtasks (`parent in (…)`), regardless of item count.
187
+
188
+ ### Output
189
+
190
+ Epics are grouped by their Parent Link and printed as a tree with box-drawing
191
+ branches (`├──`, `└──`, `│`):
192
+
193
+ ```
194
+ VOS-100 Digital Platform Modernization
195
+ ├── VOS-215 Implementing Jane Doe Artifactory PyPI
196
+ │ ├── VOS-231 In Progress Bob Provision PyPI local repo
197
+ │ │ └── VOS-232 To Do Alice Configure retention
198
+ │ └── VOS-233 To Do Bob Assemble virtual PyPI
199
+ └── VOS-220 To Do Bob Sisyphos Onboarding
200
+
201
+ VOS-105 Infrastructure 2026
202
+ └── VOS-311 Implementing Alice VMware 9.1 Enablement
203
+
204
+ (no parent)
205
+ └── VOS-999 Planning Unassigned Ad-hoc Epic
206
+ ```
207
+
208
+ Columns per row: issue key, status, assignee (truncated to 32 chars with `…`),
209
+ and the label — Epic Name for epics (falls back to summary when the Epic Name
210
+ custom field is absent), summary for stories and subtasks. Without `--full`
211
+ only the epic level is shown.
212
+
213
+ Rows are colorized when stdout is a terminal: cyan parent header, magenta
214
+ epic, green story, blue subtask. Piping or redirecting produces plain output.
@@ -0,0 +1,15 @@
1
+ jiratui/__init__.py,sha256=_7OlQdbVkK4jad0CLdpI0grT-zEAb-qgFmH5mFzDXiA,22
2
+ jiratui/__main__.py,sha256=bMpoFFpF2nVN33UhGKsbgITuEBaKzxYn2RlvhTNq-YA,69
3
+ jiratui/app.py,sha256=VfVHfBriUiVxd7SVjFyUBCRaT_55Y6PVQkvbj7jyG8E,23817
4
+ jiratui/client.py,sha256=Pi4doMYy9GuWxnHU2HjK0uG38VEMFvVO-8DD61PQsbs,17589
5
+ jiratui/config.py,sha256=irSsk00aCVWNXLMP_UkzGgLs3NCCiutePY04MOd54E0,3038
6
+ jiratui/dailywork.py,sha256=vPEwpFiO1WcLr9ynaLldF37JdfU5JTJWC2ulb9ZWmcA,1511
7
+ jiratui/jira_list.py,sha256=xFEfNcDBtWbm7AfSx4AinQpO_-851vASANRWKEeV_RM,6863
8
+ jiratui/markdown2jira.py,sha256=pN_zptBUEprruJLrvTMPYKEKX7OccQgv86evcSrp0v4,14831
9
+ jiratui/screens.py,sha256=nRmSsY9QYumGzaxxViO7SITgect5fcZ72rammIqd4sc,3348
10
+ jiratui/utils.py,sha256=kM-rs588yukdemayJKiKT-1UWO-lWKA8_r_zNjuiUgs,2362
11
+ jirasify-2.0.0.dist-info/METADATA,sha256=-r-ioLXE99AmOyO8hp8jah4w4og0hj3JKSqp2E-K9GQ,7862
12
+ jirasify-2.0.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
13
+ jirasify-2.0.0.dist-info/entry_points.txt,sha256=v3STPxYLswPnP2osER5HsQirkUZlfqLb84ulzo6iJd4,127
14
+ jirasify-2.0.0.dist-info/top_level.txt,sha256=ZbjXr-sKCqXtcwtYNTKdyp5U9HANeWz05NmCGthppd4,8
15
+ jirasify-2.0.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ jirasify = jiratui.markdown2jira:main
3
+ jirasify-list = jiratui.jira_list:main
4
+ jirasify-tui = jiratui.app:main
@@ -0,0 +1 @@
1
+ jiratui
jiratui/__init__.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "2.0.0"
jiratui/__main__.py ADDED
@@ -0,0 +1,5 @@
1
+ from jiratui.app import main
2
+
3
+
4
+ if __name__ == "__main__":
5
+ main()