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.
- leadger/__init__.py +1 -0
- leadger/__main__.py +5 -0
- leadger/cli.py +253 -0
- leadger/core/__init__.py +14 -0
- leadger/core/ics.py +82 -0
- leadger/core/ids.py +16 -0
- leadger/core/parse.py +79 -0
- leadger/core/periods.py +32 -0
- leadger/core/recur.py +45 -0
- leadger/core/storage.py +385 -0
- leadger/core/tasks.py +161 -0
- leadger/core/time_utils.py +43 -0
- leadger/core/yaml_io.py +97 -0
- leadger/server.py +221 -0
- leadger/static/assets/index-BFMiMAZM.css +2 -0
- leadger/static/assets/index-PnqahOsL.js +24 -0
- leadger/static/favicon.svg +5 -0
- leadger/static/index.html +14 -0
- leadger-0.1.0.dist-info/METADATA +215 -0
- leadger-0.1.0.dist-info/RECORD +23 -0
- leadger-0.1.0.dist-info/WHEEL +4 -0
- leadger-0.1.0.dist-info/entry_points.txt +2 -0
- leadger-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -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
|
+
[](https://pypi.org/project/leadger/)
|
|
40
|
+
[](https://pypi.org/project/leadger/)
|
|
41
|
+
[](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,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.
|