leadger 0.1.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,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg?v=2" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Leadger</title>
8
+ <script type="module" crossorigin src="/assets/index-PnqahOsL.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-BFMiMAZM.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
@@ -0,0 +1,215 @@
1
+ Metadata-Version: 2.4
2
+ Name: leadger
3
+ Version: 0.1.0
4
+ Summary: Personal productivity — local, calm, yours.
5
+ Author-email: Gabriel Henrique <gabrielhcacontato@gmail.com>
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: cli,local-first,productivity,tasks,todo,yaml
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Environment :: Console
11
+ Classifier: Environment :: Web Environment
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
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 :: Office/Business :: Scheduling
20
+ Requires-Python: >=3.11
21
+ Requires-Dist: fastapi>=0.111
22
+ Requires-Dist: ruamel-yaml>=0.18
23
+ Requires-Dist: typer>=0.12
24
+ Requires-Dist: tzdata>=2024.1; sys_platform == 'win32'
25
+ Requires-Dist: uvicorn[standard]>=0.29
26
+ Provides-Extra: dev
27
+ Requires-Dist: build>=1.2; extra == 'dev'
28
+ Requires-Dist: httpx>=0.27; extra == 'dev'
29
+ Requires-Dist: pytest>=8.0; extra == 'dev'
30
+ Requires-Dist: twine>=5.0; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+ <div align="center">
34
+
35
+ # Leadger
36
+
37
+ **Personal productivity — local, calm, yours.**
38
+
39
+ [![PyPI](https://img.shields.io/pypi/v/leadger)](https://pypi.org/project/leadger/)
40
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://pypi.org/project/leadger/)
41
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
42
+
43
+ *For the important tasks that don't belong in your work's Jira.*
44
+
45
+ </div>
46
+
47
+ ---
48
+
49
+ No cloud. No account. No telemetry. No gamification. Your data lives in a
50
+ single human-readable YAML file you can keep in git.
51
+
52
+ ```bash
53
+ pip install leadger
54
+ leadger
55
+ ```
56
+
57
+ That starts a local web UI on `localhost` and opens your browser. No Node
58
+ required — the frontend ships embedded in the package.
59
+
60
+ <!-- demo: add docs/presentation.mp4 or a screenshot here -->
61
+
62
+ ## Why Leadger?
63
+
64
+ Most task apps fail the same way: red "overdue" badges that breed anxiety,
65
+ metrics you can game by deleting tasks, and feature creep that turns a todo
66
+ list into a project-management chore. Leadger takes the opposite bet —
67
+ **statistical honesty about yourself, calmly delivered**:
68
+
69
+ - **Frozen daily goal.** The first time you open Leadger each day, it
70
+ snapshots your planned tasks: that's your goal. Tasks created during the
71
+ day count as *extras* — they add to your delivery but never inflate the
72
+ goal. Cancelling or deleting a planned task doesn't shrink the goal
73
+ either (anti-gaming, by design).
74
+ - **"% of the day delivered."** The hero metric. It can pass 100%
75
+ (over-delivery gets a second amber lap on the ring). Zero goal with
76
+ deliveries = bonus day (∞).
77
+ - **Honest rollover.** Whatever you don't finish migrates to the next day
78
+ automatically, with a visible `↻N` counter. History surfaces your most
79
+ pushed tasks — procrastination becomes visible, without judgment.
80
+ - **Personal correction factor.** *"You plan 5.8 tasks/day on average and
81
+ deliver 5.2 — your real rate is 90%."* Just statistics over your last 30
82
+ days, so you can plan like the person you actually are.
83
+ - **Week at a glance.** The Week view shows each day's % (Mon→Sun strip),
84
+ the week's aggregate on the ring, and the list split into *not done* /
85
+ *done*.
86
+ - **Stale-task alert.** A task open for 7+ days triggers a one-time,
87
+ dismissable notice: complete, reschedule, pause or cancel — deciding is
88
+ progress too.
89
+ - **Markdown summary.** One palette action copies the period's
90
+ goal/delivered/% plus both task lists — ready to paste into a standup.
91
+
92
+ ## Quick capture
93
+
94
+ An always-visible input with live syntax highlighting:
95
+
96
+ ```
97
+ Estudar FAISS #estudo !amanha
98
+ Entregar relatório #trabalho !sex
99
+ Pagar contas !2026-07-01
100
+ Meditar !todo-dia
101
+ Review da semana #trabalho !rec:seg
102
+ ```
103
+
104
+ | Token | Meaning |
105
+ |---|---|
106
+ | `#tag` | add a tag (click a tag in the list to filter by it) |
107
+ | `!hoje` / `!amanha` | target today / tomorrow |
108
+ | `!seg`…`!dom` | target the next matching weekday |
109
+ | `!YYYY-MM-DD` | target an exact date |
110
+ | `!todo-dia` | recurring: every day |
111
+ | `!rec:dia` / `!rec:seg`…`!rec:dom` | recurring: daily / weekly on that weekday |
112
+
113
+ > Capture tokens are Portuguese — Leadger is a PT-first product; the UI
114
+ > ships in Portuguese and English (toggle in the header).
115
+
116
+ **Recurring tasks** are materialized one occurrence at a time: completing
117
+ the open occurrence creates the next; cancelling or deleting it ends the
118
+ series. The daily goal stays honest — each occurrence counts as a regular
119
+ task on its day.
120
+
121
+ ## Keyboard first (mouse welcome)
122
+
123
+ | Key | Action |
124
+ |---|---|
125
+ | `n` | focus capture |
126
+ | `j` / `k` | navigate the list |
127
+ | `x` / `p` / `c` | complete · pause · cancel |
128
+ | `e` | inline edit (double-click works too) |
129
+ | `1`–`6` | period: Day · Week · Month · Quarter · Half · Year |
130
+ | `⌘K` / `Ctrl+K` | command palette |
131
+ | `g h` / `g t` | History · Today |
132
+ | `?` | cheatsheet |
133
+
134
+ Every keyboard action also has a visual control — hover a task row for
135
+ edit/pause/cancel/delete buttons, each tooltip teaching its shortcut.
136
+
137
+ ## CLI
138
+
139
+ ```bash
140
+ leadger # start the server and open the browser
141
+ leadger serve --port 8080 --no-browser
142
+ leadger add "Estudar FAISS #estudo !amanha"
143
+ leadger today # today's summary in the terminal
144
+ leadger week # weekly summary: % per day + (not) done
145
+ leadger ics --out agenda.ics # export open tasks as iCalendar
146
+ leadger --data other.yaml … # use another data file
147
+ ```
148
+
149
+ ## Calendar (.ics)
150
+
151
+ See your open tasks in any calendar app, without a cloud:
152
+ `leadger ics --out leadger.ics` writes the file, and with the server
153
+ running, `http://localhost:4242/calendar.ics` serves the same content.
154
+ Recurring tasks become `RRULE`s, so the whole series shows up projected on
155
+ your calendar. The export is read-only — the YAML remains the single
156
+ source of truth.
157
+
158
+ ## Your data
159
+
160
+ Everything lives in `~/.leadger/leadger.yaml` — a commented, readable,
161
+ versionable YAML file. Leadger preserves your comments and key order on
162
+ every write (round-trip), writes atomically and keeps a `.bak` of the
163
+ previous version. Edit it in any editor; the app detects the change and
164
+ reloads.
165
+
166
+ ```yaml
167
+ tasks:
168
+ - id: t_8f3k2a
169
+ title: Revisar pipeline de segmentação
170
+ status: todo # todo | done | paused | cancelled
171
+ target: 2026-06-09
172
+ tags: [trabalho]
173
+ migrations: 0 # times pushed to the next day
174
+ recur: seg # optional: dia | seg..dom (recurring task)
175
+ ```
176
+
177
+ ## What Leadger deliberately doesn't do
178
+
179
+ Sync, cloud, accounts, subtasks, pomodoro, XP, badges, confetti,
180
+ databases. The YAML is the single source of truth.
181
+
182
+ ## Development
183
+
184
+ See `CONTEXT.md` for the full contract (schema, business rules, phases).
185
+
186
+ ```bash
187
+ pip install -e ".[dev]"
188
+ pytest
189
+ ```
190
+
191
+ ### Frontend (React + Vite + Tailwind)
192
+
193
+ ```bash
194
+ cd frontend
195
+ npm install
196
+ npm run dev # hot reload; proxies /api to the backend on 4242
197
+ npm run build # outputs frontend/dist
198
+ ```
199
+
200
+ For development, run the backend with `leadger serve --port 4242
201
+ --no-browser` and Vite with `npm run dev`.
202
+
203
+ ### Release
204
+
205
+ ```bash
206
+ make dist # frontend build + embed into src/leadger/static + python -m build
207
+ twine upload dist/*
208
+ ```
209
+
210
+ Without `make` (PowerShell): `npm run build` in `frontend/`, copy
211
+ `frontend/dist/*` into `src/leadger/static/`, then `python -m build`.
212
+
213
+ ## License
214
+
215
+ [MIT](LICENSE)
@@ -0,0 +1,23 @@
1
+ leadger/__init__.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
2
+ leadger/__main__.py,sha256=wLraIrsV87wu981WnRtyPgMaGKgAluEk_KzJlnQN0pM,100
3
+ leadger/cli.py,sha256=V044y671s2JmxxBVmCYc1ROfiQr9Smt4x-3pbBaBJVE,8481
4
+ leadger/server.py,sha256=ickXN_VBu52pLF2NUuE0hMwU1V0RMgZWZxnN-S3C_Nc,8267
5
+ leadger/core/__init__.py,sha256=AjzFV_0cEsu7_u91rEZ-FC5njXfXwIlWiOlkALNiNHU,350
6
+ leadger/core/ics.py,sha256=7bmHvdEyoHUvCQPqGg35FTJl-0a2sN7SaCSTzEIQaoY,2582
7
+ leadger/core/ids.py,sha256=x50ISS2IVUKs920-agl32t4v8lYLK0kVQaS6A0xBsjg,397
8
+ leadger/core/parse.py,sha256=yoHA9-TjJ2xfCv_csoyZLR541POCaeZcPaRSkaiWchg,2763
9
+ leadger/core/periods.py,sha256=fXa-p0khCUmC8HU8o0Xq_2Twd5louV2Cu2jaCnayobQ,1284
10
+ leadger/core/recur.py,sha256=4wIMKY_4WNPVO6TUXXrHMPnnAGUHwL8RpV9FmRaGiH4,1444
11
+ leadger/core/storage.py,sha256=IQ1ybx7yN0TqLfwybVzSiVEPfRfTTkJH_1PdsDohn_Q,13162
12
+ leadger/core/tasks.py,sha256=-WFchiOYq_VeXQ5to2_9pGGgrCvASulM81id0KwtxUM,4791
13
+ leadger/core/time_utils.py,sha256=8ELwpbIROuYrX_heWN1sLTof12VtRtxeKjACctgZgsM,1450
14
+ leadger/core/yaml_io.py,sha256=symdryss54cb12DpSm6bs4H8ruyKmzTkP7xkfQy6t04,3370
15
+ leadger/static/favicon.svg,sha256=FIK862Iqqr_u3lGAwUXzt2Y53pABk6Ars0ERXX8NPQM,270
16
+ leadger/static/index.html,sha256=lt2fqgxSZqZVCXXbMOvh0FquKroQ5QHmCOel5ckvSMk,461
17
+ leadger/static/assets/index-BFMiMAZM.css,sha256=VcIdbvQAF6DOh2986H9p-oSVZDbwaH6U_NntUEnxFgg,23624
18
+ leadger/static/assets/index-PnqahOsL.js,sha256=-YWxZW2VIftwr9rBpoDzoaYIpqh-Th-8m2QdwwKp3XE,234233
19
+ leadger-0.1.0.dist-info/METADATA,sha256=Wj_OKIf6vWrFKzkOQIRFBpysFG52RxikwV4f7Fk0AQs,7499
20
+ leadger-0.1.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
21
+ leadger-0.1.0.dist-info/entry_points.txt,sha256=bANhxCrttP4tzwm0_TNGdgBPLJuSam1ZdMc-sOQUOac,44
22
+ leadger-0.1.0.dist-info/licenses/LICENSE,sha256=Wz-v8EWhGBc11qOjP8QBRkDowbYCn_gqZgSJUzMIF8E,1073
23
+ leadger-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ leadger = leadger.cli:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Gabriel Henrique
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.