lazyplan-tui 0.7.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.
- lazyplan_tui-0.7.0/LICENSE +21 -0
- lazyplan_tui-0.7.0/PKG-INFO +172 -0
- lazyplan_tui-0.7.0/README.md +144 -0
- lazyplan_tui-0.7.0/pyproject.toml +53 -0
- lazyplan_tui-0.7.0/setup.cfg +4 -0
- lazyplan_tui-0.7.0/src/lazyplan/__init__.py +15 -0
- lazyplan_tui-0.7.0/src/lazyplan/__main__.py +4 -0
- lazyplan_tui-0.7.0/src/lazyplan/cli.py +530 -0
- lazyplan_tui-0.7.0/src/lazyplan/cli_parser.py +240 -0
- lazyplan_tui-0.7.0/src/lazyplan/design.py +162 -0
- lazyplan_tui-0.7.0/src/lazyplan/gantt.py +37 -0
- lazyplan_tui-0.7.0/src/lazyplan/models.py +203 -0
- lazyplan_tui-0.7.0/src/lazyplan/postgres_sync.py +121 -0
- lazyplan_tui-0.7.0/src/lazyplan/render.py +175 -0
- lazyplan_tui-0.7.0/src/lazyplan/repo.py +101 -0
- lazyplan_tui-0.7.0/src/lazyplan/screens.py +437 -0
- lazyplan_tui-0.7.0/src/lazyplan/seed.py +36 -0
- lazyplan_tui-0.7.0/src/lazyplan/skills.py +415 -0
- lazyplan_tui-0.7.0/src/lazyplan/store.py +1448 -0
- lazyplan_tui-0.7.0/src/lazyplan/tui.py +711 -0
- lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/PKG-INFO +172 -0
- lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/SOURCES.txt +29 -0
- lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/dependency_links.txt +1 -0
- lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/entry_points.txt +2 -0
- lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/requires.txt +11 -0
- lazyplan_tui-0.7.0/src/lazyplan_tui.egg-info/top_level.txt +1 -0
- lazyplan_tui-0.7.0/tests/test_design.py +76 -0
- lazyplan_tui-0.7.0/tests/test_repo.py +93 -0
- lazyplan_tui-0.7.0/tests/test_skills.py +323 -0
- lazyplan_tui-0.7.0/tests/test_store.py +535 -0
- lazyplan_tui-0.7.0/tests/test_version.py +32 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Brad Lindsay
|
|
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.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: lazyplan-tui
|
|
3
|
+
Version: 0.7.0
|
|
4
|
+
Summary: Terminal stream-of-consciousness console for issue tracking + roadmap planning alongside AI agents.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/fluxion-dev/lazyplan
|
|
7
|
+
Project-URL: Repository, https://github.com/fluxion-dev/lazyplan
|
|
8
|
+
Project-URL: Issues, https://github.com/fluxion-dev/lazyplan/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/fluxion-dev/lazyplan/releases
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Operating System :: OS Independent
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Topic :: Software Development :: Bug Tracking
|
|
15
|
+
Classifier: Topic :: Office/Business :: Scheduling
|
|
16
|
+
Requires-Python: >=3.11
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: textual>=3
|
|
20
|
+
Provides-Extra: postgres
|
|
21
|
+
Requires-Dist: psycopg[binary]>=3.1; extra == "postgres"
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
24
|
+
Requires-Dist: mypy>=1.13; extra == "dev"
|
|
25
|
+
Provides-Extra: test
|
|
26
|
+
Requires-Dist: pytest>=8; extra == "test"
|
|
27
|
+
Dynamic: license-file
|
|
28
|
+
|
|
29
|
+
# lazyplan (`lp`) — v0.7.0
|
|
30
|
+
|
|
31
|
+
Terminal stream-of-consciousness console for issue tracking + roadmap planning,
|
|
32
|
+
built to run in tmux next to `opencode` and `lazygit`. Design rules live in
|
|
33
|
+
[DESIGN_SYSTEM.md](DESIGN_SYSTEM.md), enforced by `src/lazyplan/design.py`.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pipx install lazyplan-tui # isolated global `lp` (once published to PyPI)
|
|
39
|
+
# or from source: pipx install ~/personal-repos/lazyplan
|
|
40
|
+
# or: python3 -m venv .venv && . .venv/bin/activate && pip install -e .
|
|
41
|
+
lp --help
|
|
42
|
+
# optional: shell completions
|
|
43
|
+
eval "$(lp completion --shell bash)" # or --shell zsh
|
|
44
|
+
```
|
|
45
|
+
Note: this shadows the classic Unix print command `/usr/bin/lp`.
|
|
46
|
+
Use `command lp` or the full path if you ever need the printer.
|
|
47
|
+
|
|
48
|
+
DB resolution (first match wins): `--db PATH` → `$LAZYPLAN_DB` →
|
|
49
|
+
enclosing git repo's `.plan/lazyplan.db` → global
|
|
50
|
+
`~/.local/share/lazyplan/lazyplan.db`.
|
|
51
|
+
|
|
52
|
+
## Repo-scoped workflow
|
|
53
|
+
|
|
54
|
+
Each git repo gets its own plan, stored with the code:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
cd ~/my-project
|
|
58
|
+
lp init # creates .plan/lazyplan.db + .plan/config.json, then offers
|
|
59
|
+
# the agent-skills wizard (universal `.agents/skills/lazyplan/`
|
|
60
|
+
# + `## lazyplan` pointer in AGENTS.md). Flags: --no-skills,
|
|
61
|
+
# --yes, --skills-scope project|global|both|none; --json stays
|
|
62
|
+
# machine-readable and never prompts.
|
|
63
|
+
lp info # resolved db path, repo root, counts, .plan files
|
|
64
|
+
lp add-project --name "my-project" --start 2026-10-18 --end 2026-12-31
|
|
65
|
+
lp ui # statusbar shows [my-project]; agents in any subdir share it
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Run `lp` from any subdirectory — it walks up to the repo root (via
|
|
69
|
+
`git rev-parse` with a `.git` fallback). Outside a repo it uses the global DB.
|
|
70
|
+
Commit `.plan/` to share the plan with the team, or ignore `*.db` to keep it
|
|
71
|
+
local — your call.
|
|
72
|
+
|
|
73
|
+
## Release (semver)
|
|
74
|
+
|
|
75
|
+
Version lives in one place: `version` in `pyproject.toml`. The README header
|
|
76
|
+
mirrors it; `tests/test_version.py` fails the gates on drift.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
./tools/bump.sh patch [--push] # or minor | major; --dry-run to preview
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`bump.sh` validates semver, updates `pyproject.toml` + README, commits, and
|
|
83
|
+
tags `vX.Y.Z` (refuses a dirty tree or an existing tag). Pushing the tag
|
|
84
|
+
(`--push`, or Actions → bump → patch/minor/major) triggers the release
|
|
85
|
+
workflow: tag-vs-pyproject check, sdist/wheel build, GitHub Release with
|
|
86
|
+
auto-generated notes. CI (`ci.yml`) runs `./tools/check.sh` on every push/PR.
|
|
87
|
+
|
|
88
|
+
## tmux workflow
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
./tools/tmux-lazyplan.sh # plan | opencode | lazygit
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Dev / gates
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
pip install -e ".[dev,postgres]" # ruff + mypy (+ psycopg for `lp sync`)
|
|
98
|
+
./tools/check.sh # ruff check + format --check + mypy (strict)
|
|
99
|
+
# + unittest on system python AND venv python
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Standards live in [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md) (§Python standards,
|
|
103
|
+
pyguide-based).
|
|
104
|
+
|
|
105
|
+
Agents never touch the TUI process — they call `lp --actor NAME ...` against
|
|
106
|
+
the same SQLite file (proposals/questions for anything needing human eyes);
|
|
107
|
+
the TUI polls a fingerprint (mtime + counts + max ids + last event) every
|
|
108
|
+
second and toasts + activity-lines new arrivals. `lp sync` snapshots the db
|
|
109
|
+
to Postgres for SQL-side readers (see `src/lazyplan/postgres_sync.py`).
|
|
110
|
+
|
|
111
|
+
## TUI (`lp ui`)
|
|
112
|
+
|
|
113
|
+
Single panel, nano-style bottom bar (activity line, statusbar, command bar,
|
|
114
|
+
key footer). Mouse click/expand works.
|
|
115
|
+
|
|
116
|
+
| key | action |
|
|
117
|
+
|---|---|
|
|
118
|
+
| `1`/`2`/`3` | tree / gantt / feed views |
|
|
119
|
+
| `j`/`k`, arrows, click | navigate · `enter` edit detail in place |
|
|
120
|
+
| `n` | contextual new (task→story→project) |
|
|
121
|
+
| `P`/`S`/`T` | new project / story / task forms |
|
|
122
|
+
| `e` / `d` | edit · delete (with confirm) |
|
|
123
|
+
| `space` / `c` | cycle status · tick first open criterion |
|
|
124
|
+
| `+`/`-` | gantt zoom (width 20–100) |
|
|
125
|
+
| `f` / `o` / `O` | status / project / owner filter |
|
|
126
|
+
| `s` / `ctrl+p` | search · command palette (fuzzy, rows + views) |
|
|
127
|
+
| `4` then `a`/`x` | proposals view · approve / reject |
|
|
128
|
+
| `/` | focus command bar · `?` help · `r` refresh · `q` quit |
|
|
129
|
+
|
|
130
|
+
The command bar accepts the same verbs as `lp`
|
|
131
|
+
(`add-task --story 1 --title x`, `status --kind task --id 1 --to done`,
|
|
132
|
+
`tree`/`gantt`/`feed`, `help`).
|
|
133
|
+
|
|
134
|
+
## CLI (agent ingress)
|
|
135
|
+
|
|
136
|
+
Flags work before or after the subcommand (`lp list --json` == `lp --json list`).
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
lp seed
|
|
140
|
+
lp list [--status todo|doing|done] [--project ID] [--owner NAME] [--priority p0]
|
|
141
|
+
lp gantt [--tasks] [--width 40] [--status ..] [--project ID] [--owner NAME] [--priority p0]
|
|
142
|
+
# * = critical path, ! = blocked, ◆ = milestone
|
|
143
|
+
lp show --kind project|story|task --id N # full context: narrative + links + children
|
|
144
|
+
lp add-project --name "API v2" [--goal .. --metrics .. --scope-in .. --scope-out .. --assumptions ..]
|
|
145
|
+
lp add-story --project 1 --title "Auth refresh" [--owner a1 --priority p0 --labels x,y --estimate 2w --blocked-by 3]
|
|
146
|
+
lp add-task --story 1 --title "Rotate tokens" [--desc ctx --owner a1 --priority p1 --estimate 2d --blocked-by 4]
|
|
147
|
+
lp add-link --kind story --id 1 --url URL [--label spec]
|
|
148
|
+
lp add-criteria --kind task --id 1 --text "works offline"
|
|
149
|
+
lp check --id 1 / lp uncheck --id 1 # tick acceptance items (advisory)
|
|
150
|
+
lp add-risk --project 1 --title "slip" [--likelihood high --impact high --mitigation buf]
|
|
151
|
+
lp add-milestone --project 1 --title "Beta" --date 2026-11-15
|
|
152
|
+
lp propose --kind task --parent 1 --title "Refactor X" [--priority p1 --owner a1]
|
|
153
|
+
lp proposals [--status pending] | lp approve --id 1 / lp reject --id 1
|
|
154
|
+
lp ask --question "Which scope?" | lp questions | lp answer --id 1 --text "Minimal"
|
|
155
|
+
lp export [--format json|markdown] | lp import --file dump.json
|
|
156
|
+
lp sync --dsn postgresql://issues:issues@localhost:5433/issues # one-way replica
|
|
157
|
+
lp update --kind task --id 1 [--title --desc --owner --estimate --priority p0|none --labels a,b --blocked-by 1,2]
|
|
158
|
+
lp status --kind task --id 1 --to doing # closing with open criteria warns, never blocks
|
|
159
|
+
lp delete --kind task --id 1
|
|
160
|
+
lp feed [--limit 20] # recent human/agent activity
|
|
161
|
+
lp watch [--limit 20] # tail (agents: lp feed --json --follow &)
|
|
162
|
+
lp --actor agent-1 add-task --story 3 --title "Draft proposal"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Roadmap (dogfooded)
|
|
166
|
+
|
|
167
|
+
The default DB holds project **P#1 “lazyplan roadmap”** (11 stories, 37 tasks).
|
|
168
|
+
Done: S#1 MVP, S#4 planning power, S#6 distribution, S#7 ownership,
|
|
169
|
+
S#8 acceptance criteria, S#9 risk register, S#10 goals/scope, S#11 materials.
|
|
170
|
+
Doing: S#2 TUI polish (palette/search/editable-detail left). Open: S#3 agent
|
|
171
|
+
ingress, S#5 postgres sync. All feature work goes here — `lp list`,
|
|
172
|
+
`lp gantt --tasks`, `lp show --kind story --id N`, `lp ui`.
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# lazyplan (`lp`) — v0.7.0
|
|
2
|
+
|
|
3
|
+
Terminal stream-of-consciousness console for issue tracking + roadmap planning,
|
|
4
|
+
built to run in tmux next to `opencode` and `lazygit`. Design rules live in
|
|
5
|
+
[DESIGN_SYSTEM.md](DESIGN_SYSTEM.md), enforced by `src/lazyplan/design.py`.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pipx install lazyplan-tui # isolated global `lp` (once published to PyPI)
|
|
11
|
+
# or from source: pipx install ~/personal-repos/lazyplan
|
|
12
|
+
# or: python3 -m venv .venv && . .venv/bin/activate && pip install -e .
|
|
13
|
+
lp --help
|
|
14
|
+
# optional: shell completions
|
|
15
|
+
eval "$(lp completion --shell bash)" # or --shell zsh
|
|
16
|
+
```
|
|
17
|
+
Note: this shadows the classic Unix print command `/usr/bin/lp`.
|
|
18
|
+
Use `command lp` or the full path if you ever need the printer.
|
|
19
|
+
|
|
20
|
+
DB resolution (first match wins): `--db PATH` → `$LAZYPLAN_DB` →
|
|
21
|
+
enclosing git repo's `.plan/lazyplan.db` → global
|
|
22
|
+
`~/.local/share/lazyplan/lazyplan.db`.
|
|
23
|
+
|
|
24
|
+
## Repo-scoped workflow
|
|
25
|
+
|
|
26
|
+
Each git repo gets its own plan, stored with the code:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
cd ~/my-project
|
|
30
|
+
lp init # creates .plan/lazyplan.db + .plan/config.json, then offers
|
|
31
|
+
# the agent-skills wizard (universal `.agents/skills/lazyplan/`
|
|
32
|
+
# + `## lazyplan` pointer in AGENTS.md). Flags: --no-skills,
|
|
33
|
+
# --yes, --skills-scope project|global|both|none; --json stays
|
|
34
|
+
# machine-readable and never prompts.
|
|
35
|
+
lp info # resolved db path, repo root, counts, .plan files
|
|
36
|
+
lp add-project --name "my-project" --start 2026-10-18 --end 2026-12-31
|
|
37
|
+
lp ui # statusbar shows [my-project]; agents in any subdir share it
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Run `lp` from any subdirectory — it walks up to the repo root (via
|
|
41
|
+
`git rev-parse` with a `.git` fallback). Outside a repo it uses the global DB.
|
|
42
|
+
Commit `.plan/` to share the plan with the team, or ignore `*.db` to keep it
|
|
43
|
+
local — your call.
|
|
44
|
+
|
|
45
|
+
## Release (semver)
|
|
46
|
+
|
|
47
|
+
Version lives in one place: `version` in `pyproject.toml`. The README header
|
|
48
|
+
mirrors it; `tests/test_version.py` fails the gates on drift.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
./tools/bump.sh patch [--push] # or minor | major; --dry-run to preview
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`bump.sh` validates semver, updates `pyproject.toml` + README, commits, and
|
|
55
|
+
tags `vX.Y.Z` (refuses a dirty tree or an existing tag). Pushing the tag
|
|
56
|
+
(`--push`, or Actions → bump → patch/minor/major) triggers the release
|
|
57
|
+
workflow: tag-vs-pyproject check, sdist/wheel build, GitHub Release with
|
|
58
|
+
auto-generated notes. CI (`ci.yml`) runs `./tools/check.sh` on every push/PR.
|
|
59
|
+
|
|
60
|
+
## tmux workflow
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
./tools/tmux-lazyplan.sh # plan | opencode | lazygit
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Dev / gates
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pip install -e ".[dev,postgres]" # ruff + mypy (+ psycopg for `lp sync`)
|
|
70
|
+
./tools/check.sh # ruff check + format --check + mypy (strict)
|
|
71
|
+
# + unittest on system python AND venv python
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Standards live in [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md) (§Python standards,
|
|
75
|
+
pyguide-based).
|
|
76
|
+
|
|
77
|
+
Agents never touch the TUI process — they call `lp --actor NAME ...` against
|
|
78
|
+
the same SQLite file (proposals/questions for anything needing human eyes);
|
|
79
|
+
the TUI polls a fingerprint (mtime + counts + max ids + last event) every
|
|
80
|
+
second and toasts + activity-lines new arrivals. `lp sync` snapshots the db
|
|
81
|
+
to Postgres for SQL-side readers (see `src/lazyplan/postgres_sync.py`).
|
|
82
|
+
|
|
83
|
+
## TUI (`lp ui`)
|
|
84
|
+
|
|
85
|
+
Single panel, nano-style bottom bar (activity line, statusbar, command bar,
|
|
86
|
+
key footer). Mouse click/expand works.
|
|
87
|
+
|
|
88
|
+
| key | action |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `1`/`2`/`3` | tree / gantt / feed views |
|
|
91
|
+
| `j`/`k`, arrows, click | navigate · `enter` edit detail in place |
|
|
92
|
+
| `n` | contextual new (task→story→project) |
|
|
93
|
+
| `P`/`S`/`T` | new project / story / task forms |
|
|
94
|
+
| `e` / `d` | edit · delete (with confirm) |
|
|
95
|
+
| `space` / `c` | cycle status · tick first open criterion |
|
|
96
|
+
| `+`/`-` | gantt zoom (width 20–100) |
|
|
97
|
+
| `f` / `o` / `O` | status / project / owner filter |
|
|
98
|
+
| `s` / `ctrl+p` | search · command palette (fuzzy, rows + views) |
|
|
99
|
+
| `4` then `a`/`x` | proposals view · approve / reject |
|
|
100
|
+
| `/` | focus command bar · `?` help · `r` refresh · `q` quit |
|
|
101
|
+
|
|
102
|
+
The command bar accepts the same verbs as `lp`
|
|
103
|
+
(`add-task --story 1 --title x`, `status --kind task --id 1 --to done`,
|
|
104
|
+
`tree`/`gantt`/`feed`, `help`).
|
|
105
|
+
|
|
106
|
+
## CLI (agent ingress)
|
|
107
|
+
|
|
108
|
+
Flags work before or after the subcommand (`lp list --json` == `lp --json list`).
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
lp seed
|
|
112
|
+
lp list [--status todo|doing|done] [--project ID] [--owner NAME] [--priority p0]
|
|
113
|
+
lp gantt [--tasks] [--width 40] [--status ..] [--project ID] [--owner NAME] [--priority p0]
|
|
114
|
+
# * = critical path, ! = blocked, ◆ = milestone
|
|
115
|
+
lp show --kind project|story|task --id N # full context: narrative + links + children
|
|
116
|
+
lp add-project --name "API v2" [--goal .. --metrics .. --scope-in .. --scope-out .. --assumptions ..]
|
|
117
|
+
lp add-story --project 1 --title "Auth refresh" [--owner a1 --priority p0 --labels x,y --estimate 2w --blocked-by 3]
|
|
118
|
+
lp add-task --story 1 --title "Rotate tokens" [--desc ctx --owner a1 --priority p1 --estimate 2d --blocked-by 4]
|
|
119
|
+
lp add-link --kind story --id 1 --url URL [--label spec]
|
|
120
|
+
lp add-criteria --kind task --id 1 --text "works offline"
|
|
121
|
+
lp check --id 1 / lp uncheck --id 1 # tick acceptance items (advisory)
|
|
122
|
+
lp add-risk --project 1 --title "slip" [--likelihood high --impact high --mitigation buf]
|
|
123
|
+
lp add-milestone --project 1 --title "Beta" --date 2026-11-15
|
|
124
|
+
lp propose --kind task --parent 1 --title "Refactor X" [--priority p1 --owner a1]
|
|
125
|
+
lp proposals [--status pending] | lp approve --id 1 / lp reject --id 1
|
|
126
|
+
lp ask --question "Which scope?" | lp questions | lp answer --id 1 --text "Minimal"
|
|
127
|
+
lp export [--format json|markdown] | lp import --file dump.json
|
|
128
|
+
lp sync --dsn postgresql://issues:issues@localhost:5433/issues # one-way replica
|
|
129
|
+
lp update --kind task --id 1 [--title --desc --owner --estimate --priority p0|none --labels a,b --blocked-by 1,2]
|
|
130
|
+
lp status --kind task --id 1 --to doing # closing with open criteria warns, never blocks
|
|
131
|
+
lp delete --kind task --id 1
|
|
132
|
+
lp feed [--limit 20] # recent human/agent activity
|
|
133
|
+
lp watch [--limit 20] # tail (agents: lp feed --json --follow &)
|
|
134
|
+
lp --actor agent-1 add-task --story 3 --title "Draft proposal"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Roadmap (dogfooded)
|
|
138
|
+
|
|
139
|
+
The default DB holds project **P#1 “lazyplan roadmap”** (11 stories, 37 tasks).
|
|
140
|
+
Done: S#1 MVP, S#4 planning power, S#6 distribution, S#7 ownership,
|
|
141
|
+
S#8 acceptance criteria, S#9 risk register, S#10 goals/scope, S#11 materials.
|
|
142
|
+
Doing: S#2 TUI polish (palette/search/editable-detail left). Open: S#3 agent
|
|
143
|
+
ingress, S#5 postgres sync. All feature work goes here — `lp list`,
|
|
144
|
+
`lp gantt --tasks`, `lp show --kind story --id N`, `lp ui`.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "lazyplan-tui"
|
|
3
|
+
version = "0.7.0"
|
|
4
|
+
description = "Terminal stream-of-consciousness console for issue tracking + roadmap planning alongside AI agents."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
requires-python = ">=3.11"
|
|
8
|
+
dependencies = ["textual>=3"]
|
|
9
|
+
classifiers = [
|
|
10
|
+
"Programming Language :: Python :: 3",
|
|
11
|
+
"Programming Language :: Python :: 3.11",
|
|
12
|
+
"Operating System :: OS Independent",
|
|
13
|
+
"Environment :: Console",
|
|
14
|
+
"Topic :: Software Development :: Bug Tracking",
|
|
15
|
+
"Topic :: Office/Business :: Scheduling",
|
|
16
|
+
]
|
|
17
|
+
[project.urls]
|
|
18
|
+
Homepage = "https://github.com/fluxion-dev/lazyplan"
|
|
19
|
+
Repository = "https://github.com/fluxion-dev/lazyplan"
|
|
20
|
+
Issues = "https://github.com/fluxion-dev/lazyplan/issues"
|
|
21
|
+
Changelog = "https://github.com/fluxion-dev/lazyplan/releases"
|
|
22
|
+
[project.scripts]
|
|
23
|
+
lp = "lazyplan.cli:main"
|
|
24
|
+
[project.optional-dependencies]
|
|
25
|
+
postgres = ["psycopg[binary]>=3.1"]
|
|
26
|
+
dev = ["ruff>=0.8", "mypy>=1.13"]
|
|
27
|
+
test = ["pytest>=8"]
|
|
28
|
+
[build-system]
|
|
29
|
+
requires = ["setuptools>=61"]
|
|
30
|
+
build-backend = "setuptools.build_meta"
|
|
31
|
+
[tool.setuptools.packages.find]
|
|
32
|
+
where = ["src"]
|
|
33
|
+
|
|
34
|
+
[tool.ruff]
|
|
35
|
+
target-version = "py311"
|
|
36
|
+
line-length = 100
|
|
37
|
+
|
|
38
|
+
[tool.ruff.lint]
|
|
39
|
+
select = ["E", "F", "I", "UP", "B", "W"]
|
|
40
|
+
ignore = ["E501"]
|
|
41
|
+
|
|
42
|
+
[tool.ruff.lint.isort]
|
|
43
|
+
known-first-party = ["lazyplan"]
|
|
44
|
+
|
|
45
|
+
[tool.ruff.format]
|
|
46
|
+
quote-style = "double"
|
|
47
|
+
|
|
48
|
+
[tool.mypy]
|
|
49
|
+
python_version = "3.11"
|
|
50
|
+
warn_return_any = true
|
|
51
|
+
warn_unused_configs = true
|
|
52
|
+
show_error_codes = true
|
|
53
|
+
disallow_untyped_defs = true
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""lazyplan: Projects > UserStories > Tasks. TUI first, agent-injectable."""
|
|
2
|
+
|
|
3
|
+
from .models import Criterion, Link, Milestone, Project, Risk, RiskStatus, Status, Task, UserStory
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"Criterion",
|
|
7
|
+
"Link",
|
|
8
|
+
"Milestone",
|
|
9
|
+
"Project",
|
|
10
|
+
"Risk",
|
|
11
|
+
"RiskStatus",
|
|
12
|
+
"Status",
|
|
13
|
+
"Task",
|
|
14
|
+
"UserStory",
|
|
15
|
+
]
|